Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обращение к массиву структур

3.2K
13 апреля 2008 года
Gazzy
38 / / 02.08.2006
После вызова функции FRead(...) возникает ошибка Unhandlend exception 0*C0000005 Access violation. Ошибка видимо возникает изза неправильного обращения к массиву структур(выделено красным). Помогите пожалуйста исправить

Объявлеие массива структур
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:
360
13 апреля 2008 года
P*t*
474 / / 15.02.2007
попробуй сделать так: &(p0[t].u0)
3.2K
13 апреля 2008 года
Gazzy
38 / / 02.08.2006
p0 - это указатель на структуру. получается ошибка left of '.u0' must have class/struct/union type:(
3
13 апреля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Gazzy
После вызова функции FRead(...) возникает ошибка Unhandlend exception 0*C0000005 Access violation. Ошибка видимо возникает изза неправильного обращения к массиву структур(выделено красным). Помогите пожалуйста исправить

Объявлеие массива структур
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.2K
16 апреля 2008 года
Gazzy
38 / / 02.08.2006
Цитата: Green

 
Код:
// Если передаешь массив надо бы передавать и его размер
?




Насколько я знаю, при передаче функции массива , его можно объявить одним из 3 способов: как указатель, как массив определенного размера, как массив без определенного размера. Три объявления тождественны.

Цитата: Green

 
Код:
// а вот struct писать не обязательно



Почему??

Цитата: Green

 
Код:
int TIO::ReadFile(FILE* in, int opencode, WND_INFO** p0, unsigned int size)  
{  
    // goto лишь запутывает код, а без него можно легко обойтись




А меня запутывает 10 return 0 подряд. Это дело стиля.

Цитата: Green

И последний вопрос: почему бы тебе не использовать C++ и не заменить все эти fgets, sscanf на операции с потоком (fstream) ?




Чем собственно потоковые операции выигрывают у форматного ввода/вывода???? Новее, лучше,круче?

3
16 апреля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Gazzy
Насколько я знаю, при передаче функции массива , его можно объявить одним из 3 способов: как указатель, как массив определенного размера, как массив без определенного размера. Три объявления тождественны.


Смотря как передавать.
Можно передавать, как указатель на первый элемент, тогда три твоих перечисленных способа тождественны.
В этом случае по-хорошему надо передавать размерность переданного массива отдельным аргументом, т.к. может быть передан массив любой длины.

А можно передавать массив через ссылку или указатель на массив, это совершенно иное дело. Тогда функция будет принимать только массивы определенного размера.

Цитата: Gazzy

Почему??


Потому, что это не C. В C++ struct в данном случае писать не надо.

Цитата: Gazzy

А меня запутывает 10 return 0 подряд. Это дело стиля.


goto - плохой стиль, а в данном случае отвратительный.
Забавно, что 10 return подрят тебя запутывает, а 10 goto подрят тебя не запутывает. :)

Если после твоего первого if стоит return, то все ясно с первого взгляда.
Если же после if стоит goto, то приходится промотать код до конца увидеть, что там return, потом промотать обратно и продолжить изучение кода. Это удобно? Это ли не запутывает?

Цитата: Gazzy

Чем собственно потоковые операции выигрывают у форматного ввода/вывода???? Новее, лучше,круче?


Тем, что они удобнее в использовании, прощу в прочтении.
Кроме того, это лишь часть удобства C++, кроме которых есть ещё и стандартные контейнеры, которые могли бы тебе упростить жизнь. Есть ещё ссылки и пр. "крутости", которыми ты пренебрегаешь.
Смотри, на сколько проще, понятнее и симпатичнее выглядела бы твоя функция на C++:

Код:
typedef vector<WND_INFO> WndinfoArray;

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;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог