Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Структуры


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

Код

struct a
{
         char name[];
};


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


Автор: sergejzr 15.12.2004, 20:02
Например так: smile
Код

struct a
{
         char *name;
};

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

Автор: NiJazz 15.12.2004, 22:20
malloc, realloc, free - вот они! smile

Автор: _dreamer_ 16.12.2004, 14:14
А может все проще - использовать std::vector<> или std::string ?
они уж за памятью сами уследят. smile

Автор: chipset 16.12.2004, 14:24
sergej.z память лучше выделять...;)

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

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

Автор: Guest 16.12.2004, 16:11
Код

struct a
{
         char *name;
}kaka;

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



Автор: LuckLess 16.12.2004, 16:13
Это был собстно я.

Автор: Doc_d0s 16.12.2004, 18:40
Да вы не поняли надо чтобы память выделялась без явного указания размера
Код



#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

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

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)