LINUX.ORG.RU

Не работает оператор возврата return язык чистый си


0

1

Всем привет. У меня проблема с функцией. Она должна открывать JSON файл, по
ключу, доставать значение, засовывать это значение в массив и возвращать
ссылку на первый элемент массива... Она работала, но я переставил
линукс, переустановил codeblocks и она теперь не фурычит... На этапе возврата значения, где стоит return bufer она ничего не возвращает...
Да, и не задавайте вопросов почему я сканирую строчки по 50 символов, у меня json такой... Вся проблема в операторе возврата... Но вот какая?

int JSON_parse_key (char *open_file,char *key,int size_key){
    FILE *in_file=fopen(open_file,"r");
    char word1[50];
      while (fscanf(in_file,"%s",&word1)>0) {
            if (strstr(word1,key)) {
                    int dlina = strlen(word1);
                    int sizess = dlina-size_key-6;
                    int i = size_key + 4;
                    usleep(1000);
                    int ert =0;
                    unsigned char eee[sizess];
                    for (;i<dlina-2;i++,ert++) {eee[ert]=word1[i];}
                    uint8_t *dd = &eee;
                    int a=0; int ee=0;
                    char buf [2];
                    unsigned char bufer [sizess/2];
                    for (;a<sizess;a+=2) {
                            sprintf(buf,"%c%c",*(dd+a),*(dd+a+1));
                            int ar = strtol(buf,NULL,16);
                            char us = 0x00;
                            us=ar;
                            bufer[ee] = us;
                            ee++;
                                          }
                            fclose(in_file); return bufer;

                                    }

                                              }


                                                                    }


void chegoto () {
      char kluch [30];
      sprintf(kluch,"%s[%i]","IEEE",key);
      char *dd = JSON_parse_key("output.JSON",&kluch,strlen(kluch));
    /*ВОТ так раньше *dd возвращал  ссылку на первый элемент массива значения...
Тоесть в json есть число 892040, я его распарсиваю и получаю массив {89,20,40}  Апотом пишу *dd  и получаю ссылку на число 89...  А сейчас не работает ничего, вообще ума не приложу что могло случиться с кодом, я всеголишь переставил линукс....*/
}



Последнее исправление: Titan_2014 (всего исправлений: 2)

У тебя буфер который ты пытаешься вернуть из функции создан локально и при выходе из функции он разрушается т.к. находился в стеке.

normann ★★★
()

ужас какой. оформи это в виде компилируемой программы и дай конкретный json, а лучше не страдай фигней и используй libjson

quest ★★★★
()

dlina
kluch

Дальше не читал.

Вся проблема в операторе возврата

Инфа 100%, в дебагере проверял?

vazgen05 ★★★
()

гы-гы
вангую смену дистрибутива с i386 на x86_64

ЗЫ: за такой код — расстрелять! :)

anonymous
()

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

Помимо прочего осиль -Wall -Werror, может руки выпрямит со временем.

arturpub ★★
()

Используй английские слова в названиях

smilessss ★★★★★
()

Вся проблема в операторе возврата... Но вот какая?

Это ты должен был рассказать. Здесь баг детский (если конечно он один — вряд ли кто-то это парсил), но на будущее пиши что ожидалось, что произошло, в чем разница.

arturpub ★★
()
Ответ на: комментарий от KennyMinigun

Говнокодить могут только авторизованные пользователи

Авторизуйтесь.

да ну нахер :)

anonymous
()

Пистолет. Нога. Выстрел.

Раньше попадал в пол, потом переставил ногу и теперь не попадаю в пол. Кровь, анафилактический шок, адская боль.

А я всего лишь ногу переставил!

habamax ★★★
()
Ответ на: комментарий от arturpub

Вто м то и дело,я взрослых ошибок то и неделаю :D Всегда проблема в какойнить фигне... Чё самое интересное раньше этот код работал без маллока... А щас буду пробовать исправлять...

Titan_2014
() автор топика

Тему не читал. Код тоже не читал.

λ> clang -Wall test.c
test.c:29:20: warning: incompatible pointer types initializing 'uint8_t *' (aka 'unsigned char *') with an expression of type
      'unsigned char (*)[sizess]' [-Wincompatible-pointer-types]
          uint8_t* dd = &eee;
                   ^    ~~~~
test.c:46:11: error: use of undeclared identifier 'returnbufer'
          returnbufer;
          ^
test.c:59:37: error: use of undeclared identifier 'key'
  sprintf (kluch, "%s[%i]", "IEEE", key);
                                    ^
test.c:60:45: warning: incompatible pointer types passing 'char (*)[30]' to parameter of type 'char *' [-Wincompatible-pointer-types]
  char* dd = JSON_parse_key ("output.JSON", &kluch, strlen (kluch) );
                                            ^~~~~~
test.c:8:44: note: passing argument to parameter 'key' here
int JSON_parse_key (char* open_file, char* key, int size_key)
                                           ^
test.c:60:9: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int';
  char* dd = JSON_parse_key ("output.JSON", &kluch, strlen (kluch) );
        ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 warnings and 2 errors generated.

p.s. Не благодари.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Titan_2014

Если будет тип самой функции чар то он воще нифига не вернёт...

Омфг, пацаны, я понял для чего там инт!

Вто м то и дело,я взрослых ошибок то и неделаю :D Всегда проблема в какойнить фигне...

Да-да, мы у же понели :D

arturpub ★★
()
Ответ на: комментарий от Deleted

И чё? Тут благодарить не за что зрением бог не обделил, в журнал компиляции поглядываю

 int JSON_parse_key (char *open_file,char *key,int size_key){
    FILE *in_file=fopen(open_file,"r");
    char word1[50];
      while (fscanf(in_file,"%s",&word1)>0) {
            if (strstr(word1,key)) {
                    int dlina = strlen(word1);
                    int sizess = dlina-size_key-6;
                    int i = size_key + 4;
                    usleep(1000);
                    int ert =0;
                    unsigned char eee[sizess];
                    for (;i<dlina-2;i++,ert++) {eee[ert]=word1[i];}
                    uint8_t *dd = &eee;
                    int a=0; int ee=0;
                    char buf [2];
/*Вот они заветные 2 строчки*/
                    char *bufer; 
                    bufer = malloc((sizess/2)*sizeof(char));
/*-------------------------*/
                    for (;a<sizess;a+=2) {
                            sprintf(buf,"%c%c",*(dd+a),*(dd+a+1));
                            int ar = strtol(buf,NULL,16);
                            char us = 0x00;
                            us=ar;
                            bufer[ee] = us;
                            ee++;
                                          }


                            fclose(in_file); return bufer;


                                    }

                                              }


                                                                    }
вот так всё заработало...

Titan_2014
() автор топика
Ответ на: комментарий от arturpub

Поменяю) Я смотрю ты хорошо разбираешься во всём... Слушай, щас сижу мучаюсь: на 2х компах линукс... На одном компилирую прогу, кидаю её на флешку, переношу на другой комп, там запускаю а там пишется comand not found... Очень надо на другом её запустить, не знаю как ... Точнее знаю, что можно кидануть туда исходники и там скомпилировать, но мне так не выгодно... Линуксы оба Mint оба x64 Идентичные в общем...

Titan_2014
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.