URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7200
[ Назад ]

Исходное сообщение
"Указатель на структуру в С"

Отправлено RomanB , 21-Фев-08 14:35 
Всем привет!
Какой-то глупый затык, но в голову ничего не лезит, уже 2 дня ничего не могу понять.
Есть код:

/************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <syslog.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

char ch_main_error[255];     //Error messages
int i_ini_file;         //ID of ini-file

char ch_read_data_[1];         // Temporary variable for reading simbols from ini-file
char ch_read_data[255];     // Variable for buildinf string
int i_read_count;        // Count of readed simbols

typedef struct{    
    char ch_string[255];
    int i_type;         /*0 - section, 1 - key, 2 - comment, 3 - empty string */
    char ch_sec_name[20];
    char ch_name[20];
    char ch_value[255];
} str_ini_data;

//int y;
str_ini_data s_ini_data;


int iReadIniFile(char* ch_ini_file){

    int i_num = 0;

    i_read_count = 0;
    strcpy(ch_read_data,"");
    strcpy(ch_read_data_,"");

    if ((i_ini_file = open(ch_ini_file, O_RDONLY)) < 0 ){
    strcpy(ch_main_error,"IniParser:iReadIniFile: Can't open file.");
    return -1;
    }

    str_ini_data *ptr_ini_data;
    ptr_ini_data = &s_ini_data;
    
    ptr_ini_data = (str_ini_data *) malloc(sizeof(str_ini_data));
    
    while(i_read_count = read(i_ini_file,ch_read_data_,1)){
    if (ch_read_data_[0] == '\n'){
        ptr_ini_data = (str_ini_data *) reallocf(ptr_ini_data,(sizeof(str_ini_data)));
        stpcpy(ptr_ini_data[i_num].ch_string, ch_read_data);
/*****/        printf("");
        strcpy(ch_read_data,"");
        strcpy(ch_read_data_,"");
        i_num++;
    }
    strncat(ch_read_data,ch_read_data_,1);
    }

    free (ptr_ini_data);
    return 0;
    
}

int main(){
    strcpy(ch_main_error,"");
    printf("%i\n%s\n",iReadIniFile("./lib.ini"),ch_main_error);
    return 0;
}

/************************************************************/

Со строчкой printf(""); все работает, вопросов не возникает. Но как только каментю ее -- прога вылетает с созданием core-файла. Парни, подскажите, в чем проблема???? Может сама логика увеличения памяти под структуру неверная???
Еще вопрос: подскажите чем на FreeBSD кору разобрать удобно?
Заранее, огромное спасибо.


Содержание

Сообщения в этом обсуждении
"Указатель на структуру в С"
Отправлено Andrey Mitrofanov , 21-Фев-08 15:05 
>    ptr_ini_data = (str_ini_data *) malloc(sizeof(str_ini_data));
>     ptr_ini_data = (str_ini_data *) reallocf(ptr_ini_data,(sizeof(str_ini_data)));

Твои "sizeof(str_ini_data)" делают совсем не то, что тебе хотелось бы.
Размер "не тот", размер не увеличивается.

>     stpcpy(ptr_ini_data[i_num].ch_string, ch_read_data);

"strcpy"? Индекс массива "не там": что-нибудь вроде ptr_ini_data->ch_string[i_num]
, судя по телепатическим обрывкам, доносящимся....

>Парни, подскажите, в чем проблема????

Каша в голове ==>
|Наверное, потому, что он выполняет то, что ты _написал_, а то,
|что ты написал -- "не совсем то, что ты хотел", чтобы "он выполнял"?
(тм) %) http:/openforum/vsluhforumID9/7184.html#1

> Может сама логика увеличения памяти под структуру неверная???

Логика-то, может быть, и верная -- только её ещё надо "в компилятор"
вложить, а он уж точно _тупая_ "железка" и телепатией зе занимается.

>Заранее, огромное спасибо.

И Вам - пожалуйста.


"Указатель на структуру в С"
Отправлено RomanB , 21-Фев-08 17:42 
Все равно не понятно :о(
Давайте я по-другому спрошу:
есть структура, объявленная типом. Нужно создать массив этого типа, заполнить его, динамически увеличивая его размер. К примеру:

typedef struct{
  char str1[255];
  char str2[255];
} my_type;

my_type my_array[1];

Как динамчески увеличивая размерность my_array[] заполнить его?


"Указатель на структуру в С"
Отправлено anonymous , 22-Фев-08 02:48 
>typedef struct{
>  char str1[255];
>  char str2[255];
>} my_type;

А ты точно хочешь использовать такие строки? char blah[255]?  Я думаю что гораздо полезнее будет просто char *blah

>
>my_type my_array[1];
>
>Как динамчески увеличивая размерность my_array[] заполнить его?

Уже никак.  Если это глобальнео объявление -- my_array распределился в статической памяти.  Если внутри функции -- то в автоматической.

Вообще нужно так:

my_type *my_array;
int elements;

elements = 10;
my_array = (my_type *) malloc(sizeof(my_type) * elements);
...
elements += 5;
my_array = (my_type *) realloc(sizeof(my_type) * elements);


"Указатель на структуру в С"
Отправлено phpcoder , 26-Фев-08 14:09 
Ваш код ужасен... :-( Советую для начала прочитать хотя бы Кернигана и Ритчи.



"Указатель на структуру в С"
Отправлено matveev_roman , 28-Июл-08 16:32 
а, Еще лучше, использовать динамику STL


"Указатель на структуру в С"
Отправлено jd2 , 29-Июл-08 20:03 
>а, Еще лучше, использовать динамику STL

Ага, и совсем ничего, что это из другого языка...