Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структуры, строки в структурах 
:(
    Опции темы
Doc_d0s
  Дата 15.12.2004, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле

Репутация: 2
Всего: 3



Надо сделать так, чтобы в структуре мог быть массив переменного размера!!!! smile
типа так:

Код

struct a
{
         char name[];
};


, но не стоит меня называть придуркм и оленем язнаю что так нельзя, но тогда как поменять размерность массива во время выполнения программы? smile


--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
sergejzr
Дата 15.12.2004, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Например так: smile
Код

struct a
{
         char *name;
};

main()
{
a myStruct;
a.name="odin massiv";
a.name="drugoj massiv";
//итд.
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
NiJazz
Дата 15.12.2004, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



malloc, realloc, free - вот они! smile
PM MAIL   Вверх
_dreamer_
Дата 16.12.2004, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



А может все проще - использовать std::vector<> или std::string ?
они уж за памятью сами уследят. smile
PM MAIL   Вверх
chipset
Дата 16.12.2004, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



sergej.z память лучше выделять...;)


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
sergejzr
Дата 16.12.2004, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(chipset @ 16.12.2004, 13:24)
sergej.z память лучше выделять...;)

Для начала и так вполне нормально. Главное идея указателая на любой участок памяти ;)


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Guest
Дата 16.12.2004, 16:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

struct a
{
         char *name;
}kaka;

int i;
printf("razmer massiva:");
scanf("%d",&i);
kaka.name=(char *)malloc(i);



  Вверх
LuckLess
Дата 16.12.2004, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



Это был собстно я.
PM MAIL   Вверх
Doc_d0s
Дата 16.12.2004, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле

Репутация: 2
Всего: 3



Да вы не поняли надо чтобы память выделялась без явного указания размера
Код



#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define dataEr  printf("\t\t\t\t!!!ERROR!!! \n\n\t\tFILE IS EMPTY or no match symbolyc      //|-> information!\n\n")
#define FileEr  printf("\t\t\t\t!!!ERROR!!! \n\n\t\tNo such fiLe or DirEctOry\n\n")
#define QUIT printf("\nDo you want to close this program?(y/n)\t"); if( getche()=='y' ) exit(0)

struct socker
{
char name[40]; /*Вот тута и надо чтобы он был переменным*/
int wins;
int fails;
int nono;
int out;
int in;
};

void printstruct(socker *pointer,int i);

int main()
{
int i,n;
socker *p;
FILE*f;

while(1)
{
printf("\nHow much team's information consist the file?\n");
scanf("%d",&n);
p=new socker[n];
if ((f=fopen("C:\\in1.txt","r"))!=NULL)
{
 for (i=0;i<n;i++)
 {
//  system("cls");
  if(fscanf(f,"%s",&(p+sizeof(socker)*i)->name)==EOF)             /* т.е тут надо выделять память динамически, ведь мы не знаем скоко символов в строке названия команды*/
  {
   dataEr;
   break;
  }
  if(fscanf(f,"%d",&(p+sizeof(socker)*i)->wins)==EOF)
  {
  dataEr;
   break;
  }
  if(fscanf(f,"%d",&(p+sizeof(socker)*i)->fails)==EOF)
  {
  dataEr;
   break;
  }
  if(fscanf(f,"%d",&(p+sizeof(socker)*i)->nono)==EOF)
  {
  dataEr;
   break;
  }
  if(fscanf(f,"%d",&(p+sizeof(socker)*i)->out)==EOF)
  {
  dataEr;
   break;
  }
  if(fscanf(f,"%d",&(p+sizeof(socker)*i)->in)==EOF)
  {
  dataEr;
   break;
  }
  printstruct(p,i);
  getch();
 }
}
else
{
   FileEr;
   exit(0);
}
system("cls");
sort(p,n);
for(i=0;i<n;i++)
{
 printstruct(p,i);
 getch();
}
fclose(f);
delete p;
QUIT;
}

return 0;
}

void printstruct(socker *p,int i)
{
  //system("cls");
  printf("\t\t\t\t|Team #%d|\n",i+1);
  printf("|  Name  | %s \n",*(p+sizeof(socker)*i)->name);
  printf("|  Wins  | %d \n",(p+sizeof(socker)*i)->wins);
  printf("|  Fails | %d \n",(p+sizeof(socker)*i)->fails);
  printf("|  Nono  | %d \n",(p+sizeof(socker)*i)->nono);
  printf("|  Out   | %d \n",(p+sizeof(socker)*i)->out);
  printf("|  In    | %d \n",(p+sizeof(socker)*i)->in);
 
}

во как smile
--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
Nastya
Дата 16.12.2004, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



В принципе использовать stl, но лучше при любом случае, как-то извратится и определить сначала размер. Файл, ты судя по всему создаешь тоже программно.
Так вот в этом случае, лучше строку сделать статической длинны, тогда , загрузить/выгрузить структуру из /в файла можно одной строкой smile

И еще,
извени, но у тебя жудкие дэфайны smile


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
sergejzr
Дата 16.12.2004, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



размер файла узнаёшь таким образом:
Код
long fsize = filelength(fileno(f));

Это и будет размер массива smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
_dreamer_
Дата 17.12.2004, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



p+sizeof(socker)*i - судя по всему это попытка получения указателя на i-ый элемент массива p. тогда если p имеет тип socker* - ерунду получишь. (выход за пределы массива)
не надо мудрить, пиши просто p[i]. Или просто *(p + i).

и в конце память освобождаеться должна как delete [] p;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.