The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Указатель на структуру в С"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Указатель на структуру в С"  
Сообщение от RomanB email(ok) on 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 кору разобрать удобно?
Заранее, огромное спасибо.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Указатель на структуру в С"  
Сообщение от Andrey Mitrofanov on 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

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

my_type my_array[1];

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Указатель на структуру в С"  
Сообщение от anonymous (??) on 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);

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Указатель на структуру в С"  
Сообщение от matveev_roman email(ok) on 28-Июл-08, 16:32 
а, Еще лучше, использовать динамику STL

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру