Обращение к массиву структур
Объявлеие массива структур
struct WND_INFO *wndinfo[SPD_SIZE];
функция
int TIO::ReadFile(FILE *in,int opencode,struct WND_INFO *p0[]){
int t;
char mmsbuf[BUFLEN];
if(!in)goto alles;
for(t=0;t<SPD_SIZE;t++){
if(fgets(mmsbuf,BUFLEN,in)==NULL)goto alles;
if( sscanf(mmsbuf,"%lf[COLOR="Red"]",&p0[t]->u0[/COLOR],)!=1 )goto alles;}
return 1;
alles:
return 0;
}
вызов функции
if(!io.ReadFile(in_wrose,4,wndinfo)) exit(1);
:confused: :confused: :confused:
Объявлеие массива структур
struct WND_INFO *wndinfo[SPD_SIZE];
функция
int TIO::ReadFile(FILE *in,int opencode,struct WND_INFO *p0[]){
int t;
char mmsbuf[BUFLEN];
if(!in)goto alles;
for(t=0;t<SPD_SIZE;t++){
if(fgets(mmsbuf,BUFLEN,in)==NULL)goto alles;
if( sscanf(mmsbuf,"%lf[COLOR="Red"]",&p0[t]->u0[/COLOR],)!=1 )goto alles;}
return 1;
alles:
return 0;
}
вызов функции
if(!io.ReadFile(in_wrose,4,wndinfo)) exit(1);
:confused: :confused: :confused:
Жуть, кто тебя так учил писать код?
Перепишем для начала твой метод:
// а вот struct писать не обязательно
int TIO::ReadFile(FILE* in, int opencode, WND_INFO** p0, unsigned int size)
{
// goto лишь запутывает код, а без него можно легко обойтись
if(in == NULL) return 0;
// счетчик t можно вполне определить в самом for
for(int t=0; t<size; t++) {
char mmsbuf[BUFLEN];
if( fgets(mmsbuf, sizeof(mmsbuf), in) == NULL
|| sscanf(mmsbuf, "%lf", &p0[t]->u0) != 1 )
return 0;
}
return 1;
}
А теперь обрати внимание, что
struct WND_INFO *wndinfo[SPD_SIZE];
это не "массив структур", а массив указателей на структуру.
Чем инициализированы эти указатели?
Вот в этой записи
&p0[t]->u0[/COLOR]
ты пытаешься разыменовать указатель, который указывает неизвестно куда.
И последний вопрос: почему бы тебе не использовать C++ и не заменить все эти fgets, sscanf на операции с потоком (fstream) ?
Насколько я знаю, при передаче функции массива , его можно объявить одним из 3 способов: как указатель, как массив определенного размера, как массив без определенного размера. Три объявления тождественны.
Почему??
{
// goto лишь запутывает код, а без него можно легко обойтись
А меня запутывает 10 return 0 подряд. Это дело стиля.
И последний вопрос: почему бы тебе не использовать C++ и не заменить все эти fgets, sscanf на операции с потоком (fstream) ?
Чем собственно потоковые операции выигрывают у форматного ввода/вывода???? Новее, лучше,круче?
Смотря как передавать.
Можно передавать, как указатель на первый элемент, тогда три твоих перечисленных способа тождественны.
В этом случае по-хорошему надо передавать размерность переданного массива отдельным аргументом, т.к. может быть передан массив любой длины.
А можно передавать массив через ссылку или указатель на массив, это совершенно иное дело. Тогда функция будет принимать только массивы определенного размера.
Почему??
Потому, что это не C. В C++ struct в данном случае писать не надо.
А меня запутывает 10 return 0 подряд. Это дело стиля.
goto - плохой стиль, а в данном случае отвратительный.
Забавно, что 10 return подрят тебя запутывает, а 10 goto подрят тебя не запутывает. :)
Если после твоего первого if стоит return, то все ясно с первого взгляда.
Если же после if стоит goto, то приходится промотать код до конца увидеть, что там return, потом промотать обратно и продолжить изучение кода. Это удобно? Это ли не запутывает?
Чем собственно потоковые операции выигрывают у форматного ввода/вывода???? Новее, лучше,круче?
Тем, что они удобнее в использовании, прощу в прочтении.
Кроме того, это лишь часть удобства C++, кроме которых есть ещё и стандартные контейнеры, которые могли бы тебе упростить жизнь. Есть ещё ссылки и пр. "крутости", которыми ты пренебрегаешь.
Смотри, на сколько проще, понятнее и симпатичнее выглядела бы твоя функция на C++:
int TIO::ReadFile(ifstream& in, WndinfoArray& wndinfo)
{
for(int t=0; t < wndinfo.size(); t++) {
if( in.eof() ) {
return 0;
}
in >> wndinfo[t].u0;
}
return 1;
}