Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2015, 16:02   #21
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут два цикла? В коде выше просто пример функции (ну или без функции, не важно) для добавления одного элемента в массив.
То есть добавлять много элементов как-то так:
Код:
while (есть что добавлять)
{
    data = получить_данные();
    ДобавитьЭлемент(data);
}
Цитата:
И такой вопрос, как я понял, sizeof(base)/sizeof(base[0]) не работает с массивами на которые выделена память... Подскажите, как тогда подсчитать кол-во элементов ?
Никак. Хранить кол-во элементов в переменной (считать по мере добавления, как в предыдущем коде).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 17.11.2015 в 16:17.
Alex11223 вне форума Ответить с цитированием
Старый 17.11.2015, 16:35   #22
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

разобрался, но я не делал функцией, а напрямую его внедрил в цикл. Только вопрос. Как теперь мне массивом воспользоваться в другой функции? Пишет что она занята...

Run-Time Check Failure #3 - The variable 'base' is being used without being defined.

Код:
int ramUse = 0;
int baseSize = 5;
baseRecord *base = (baseRecord*)malloc(baseSize*sizeof(baseRecord)); // выделим памяти для пяти элементов

while( ! feof(fileDB) )
		{
			char *pos;
			if( ramUse == baseSize ) // Если у нас кол-во записей совпадает с базовым размером то расширяем нашу память
			{
				baseSize *= 2; // В два раза
				base = (baseRecord*)realloc(base, baseSize * sizeof(baseRecord)); // Перераспределим память
			}
			fscanf(fileDB, "%d|%d|", &base[ramUse].id, &base[ramUse].productID);
			fgets(base[ramUse].name, MAX_NAME, fileDB);
			pos = strrchr(base[ramUse].name, '\n');
			if(pos)
				*pos = 0;
			ramUse++;
		}

Последний раз редактировалось Stilet; 19.11.2015 в 15:07.
makar3000 вне форума Ответить с цитированием
Старый 17.11.2015, 16:53   #23
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

"is being used without being defined" вообще-то означает ровно наоборот, что переменная с таким именем не найдена.
Ну если это не глобальная переменная, то можно просто передать в функцию параметр. Массив в С это просто указатель.

И по-моему тут baseSize и ramUse тут надо поменять местами чтоб названия соответствовали назначению.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.11.2015, 17:00   #24
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Так я ведь после структуры указал переменную (не в функции) base , собственно она глобальная. Так почему я ее не могу вызвать из другой функции?
makar3000 вне форума Ответить с цитированием
Старый 17.11.2015, 17:02   #25
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Чего за "переменная после структуры"? Строка номер 3 из кода выше где находится?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.11.2015, 17:05   #26
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Тот код , он находится в функции createDB

Код:
typedef struct {
	int id;
	int productID;
	char name[MAX_NAME];
} baseRecord;

baseRecord *base;

void createDB()...
makar3000 вне форума Ответить с цитированием
Старый 17.11.2015, 17:16   #27
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну значит должно работать и дело в чем-то другом. В createDB вы ж используете его.

Но если предыдущий код прям так и есть в функции, то вы там создали локальную переменную, а глобальную не меняли.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.11.2015, 17:22   #28
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Разобрался, не в том файле огласил глобальный массив

Подскажите пожалуйста, проблема с зоной видимости переменной base...

У меня три файла:
function.h:
Код:
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>

#define MAX_NAME 100
#define MAX_DB 100

typedef struct {
	int id;
	int productID;
	char name[MAX_NAME];
} baseRecord;

#ifndef __SECOND_FILE
#define __SECOND_FILE
	extern baseRecord *base;

	extern const char* db;
	extern int countDB;
	extern void createDB();
#endif
function.c:
Код:
#include "function.h"

baseRecord *base;

const char* db = "database.txt";
int countDB = 0;

void createDB() {/*=====*/}
main.c:
Код:
#include "function.h"
int main(void)
{
        setlocale( LC_ALL, "Russian" );
	createDB(); // Откроем/создадим базу
        showTable();

        system("pause");
	return 0;
}

int showTable(void)
{
        int i;

	if( ! countDB )
	{
		printf("| %-62s |\n", "База данных пуста");
	}
	else
	{
		for( i = 0; i < countDB; i++ )
		{
			printf("| %3d | %-13d | %-17s |\n", base[i].id, base[i].productID, base[i].name);
		}
	}
}
При первом запуске программы и гетинга данных с файла, таблица заполняется, а вот после расширения памяти и добавления нового элемента и последующего повторного запуска showTable показывает кракозябкры аля: -1232131|-12314329843854|-2313123

Последний раз редактировалось Stilet; 19.11.2015 в 15:08.
makar3000 вне форума Ответить с цитированием
Старый 19.11.2015, 14:45   #29
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А чего за ifndef __SECOND_FILE в середине файла? include guard'ы обычно на все содержимое хедер файла делают, а не на половину.

И для функций можно не писать extern.

Ну а проблема ж скорее всего в createDB, так что непонятно зачем он не показан. И где тут "добавление нового элемента"?


Вообще я бы не делал глобальные переменные, а создавал/объявлял бы их в main'е и передавал параметрами в функции.
А еще лучше структура типа такой
Код:
typedef struct {
	int id;
	int productID;
	char name[MAX_NAME];
} DatabaseRecord;

typedef struct {
    int recordsCount;
    DatabaseRecord* records;
} Database;


Код:
int main(void)
{
    const char* dbPath = "database.txt";
    
    Database db;
    
    initDb(&db);
    
    readDbFile(dbPath, &db);
    
    printTable(&db);
    
    return 0;
}

void initDb(Database* db)
{
    db->recordsCount = 0;
    db->records = 0;
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.11.2015, 14:49   #30
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Код:
void addDB()
{
	int productID;
	char name[MAX_NAME];

	printf("\n> Инвентарный номер: ");
	scanf("%d", &productID);
	printf("\n> Название товара: ");
	getRusText(name);

	if( productID < 0 )
	{
		system("cls");
		showTable();
		printf("Вы ввели неверные данные. Попробуйте еще раз\n");
		addDB();
		return 0;
	}
	
	if( countDB > 0 )
		countDB++;
	else
		countDB = 0;

	base = (baseRecord*)realloc(base, sizeof(baseRecord)*(countDB+1)); 

	base[countDB].id = countDB;
	base[countDB].productID = productID;
	strcpy(base[countDB].name, name);

	system("cls");
	showTable();
}
makar3000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как при указании типа переменной сослаться на файл? fezilk25 Общие вопросы Delphi 1 25.04.2013 23:45
Сохранение формы в файл. КАК? Pavelsss JavaScript, Ajax 6 28.12.2012 15:59
Сохранение структуры в файл Fellics{новичок} Общие вопросы Delphi 20 20.11.2011 20:21
сохранение нескольких излбражений в один файл.. как? IGWI Мультимедиа в Delphi 7 18.11.2008 23:16
Сохранение в файл сложной динамической структуры _Инженер_ Общие вопросы Delphi 24 20.10.2008 09:38