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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с структурами 
V
    Опции темы
Robin
Дата 31.5.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код


#include <stdio.h>
#include <stdlib.h>
#define MAX 15

struct myaim {
    char *glob;
    char *local;
    char *net;
}inf[MAX];

int freef();
void add();
void print();


void main()
{
int a;

printf("Hey! Here i write my aims\n");
printf("SELECT:\n");
printf("1 - Add\n");
printf("2 - Show\n");

scanf("%d", &a);

if(a == 1){
    add();
}
else
    if(a == 2){
        print();
    }
    else
        printf("Unknown command\n");
}

int freef()
{
register int i;

for(i = 0; inf[i].glob[0] && i<MAX; i++);

if(i == MAX) {
    return -1;
}
return i;
}

void add()
{
    int type;
   int slot;
    char c[80];
    puts("Enter type of aim: \n");
    puts("1 - global\n");
    puts("2 - local\n");
    puts("3 - net\n");
    scanf("%d", &type);

    slot = freef();
    if(slot == -1){
        printf("\nNo free memory");
    }
else
    {
switch(type)
{
    case 1:
    printf("Enter aim\n");
    scanf("%s", inf[slot].glob);
    break;
    case 2:
    printf("Enter aim\n");
    scanf("%s", inf[slot].local);
    break;
    case 3:
    printf("Enter aim\n");
    scanf("%s", inf[slot].net);
    break;
    default: puts("Unknown format\n");
}
}

printf("Added\n");

}

void print()
{
    register int i;

    for(i = 0; i<MAX; ++i){
        if(inf[i].glob[0]){
            printf("Here what i have to do\n");
            printf("%s\n", inf[i].glob);
            printf("%s\n", inf[i].local);
            printf("%s\n", inf[i].net);
        }
    }
    printf("\n");
}



Код

C:\Documents and Settings\Стас>C:\lcc\lcc\servvvv.exe
Hey! Here i write my aims
SELECT:
1 - Add
2 - Show
1
Enter type of aim:

1 - global

2 - local

3 - net

2

abnormal program termination

просьба указать на ошибки
PM MAIL   Вверх
FiMa1
Дата 31.5.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



К моменту выполнения for(i = 0; inf[i].glob[0] && i<MAX; i++); в функции freef поле glob не проинициализировано ни каким значением.
А, если не секрет, каков смысл этого цикла?

Это сообщение отредактировал(а) FiMa1 - 31.5.2007, 14:14
PM   Вверх
JackYF
Дата 31.5.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Robin @  31.5.2007,  13:46 Найти цитируемый пост)
2
abnormal program termination


Что-то я не вижу кода функции print(), которая вызывается при выборе 2-го пункта меню.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Robin
Дата 31.5.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



FiMa1 следовательно там 0, и запишется в первый слот, не так ли?
PM MAIL   Вверх
v_nikolaev
Дата 31.5.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Robin @ 31.5.2007,  14:17)
FiMa1 следовательно там 0, и запишется в первый слот, не так ли?

проблема в том, что glob - указатель. он проинициализирован нулём, а когда ты к нему как к массиву обращаешься, он и смотрит первый элемент массива, начинающегося с адреса 0x0 - вот и проблема.
PM MAIL   Вверх
FiMa1
Дата 31.5.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Robin @ 31.5.2007,  14:17)
FiMa1 следовательно там 0, и запишется в первый слот, не так ли?

Не так. С какой стати? Не зависимо ни от какого условия мы, при указании типа aim '1', т.е. Add, мы идем на выполнение функции freef: slot = freef(); К этому моменты указатель char *glob; не инициализирован ни каким значение (Bad Ptr), мы же с ним что-то пытаемся проделать...
PM   Вверх
v_nikolaev
Дата 31.5.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(FiMa1 @ 31.5.2007,  14:21)
Цитата(Robin @ 31.5.2007,  14:17)
FiMa1 следовательно там 0, и запишется в первый слот, не так ли?

Не так. С какой стати? Не зависимо ни от какого условия мы, при указании типа aim '1', т.е. Add, мы идем на выполнение функции freef: slot = freef(); К этому моменты указатель char *glob; не инициализирован ни каким значение (Bad Ptr), мы же с ним что-то пытаемся проделать...

даже, если проинициализировать нулём - проблема не исчезнет smile
PM MAIL   Вверх
Robin
Дата 31.5.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код


void init()
{
register int i;
for(i = 0; i<MAX; ++i) inf[i].glob[0]= '\0';    


не помогло
PM MAIL   Вверх
FiMa1
Дата 31.5.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(v_nikolaev @ 31.5.2007,  14:24)
даже, если проинициализировать нулём - проблема не исчезнет smile

Да, согласен. Не понятен в принципе смысл цикла в приведенном выше контексте...
PM   Вверх
FiMa1
Дата 31.5.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Robin @ 31.5.2007,  14:31)
Код
void init()
{
register int i;
for(i = 0; i<MAX; ++i) inf[i].glob[0]= '\0';    
}

не помогло

Robin, понимаешь, после объявления char *glob; есть указатель, который, по-умолчанию, указывает на адрес 0x00000000 в памяти. Т.о, когда мы пишем for(i = 0; i<MAX; ++i) inf[i].glob[0]= '\0'; , мы пытаемся обратиться к glob как к массиву (массиву символов в твоем понимании здесь)  вернее к первому элементу данного массива, т.е. все к тому же адресу 0x00000000 (уже сказал v_nikolaev).
Видимо, следует сделать так (т.е. предварительно выделить память под MAX символов + проинициализировать указатель валидным адресом в памяти):
Код
void init()
{
    register int i = 0;
    inf[0].glob = (char*)malloc(MAX);
    
    while( i < MAX )
        inf[0].glob[i++] = '\0';
}


Это сообщение отредактировал(а) FiMa1 - 31.5.2007, 15:21
PM   Вверх
Robin
Дата 31.5.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спс, только там в 7 срочке вместо  inf[0].glob[i++] = '0'; -  inf[0].glob[i++] = '\0';, тоесть не ноль а нулевой символ

PM MAIL   Вверх
FiMa1
Дата 31.5.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Robin @ 31.5.2007,  15:10)
только там в 7 срочке не ноль а нулевой символ

Я видел, не суть...
Не забудь, что выделенную память придется где-то освобождать!!!

Это сообщение отредактировал(а) FiMa1 - 1.6.2007, 08:59
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0955 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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