Как правильно вернуть строку из функции в Dynamic C? - PullRequest
1 голос
/ 02 апреля 2010

У меня есть программа, которую я пытаюсь отладить, но Dynamic C, очевидно, обрабатывает строки иначе, чем обычный C (ну, в любом случае, массивы символов). У меня есть функция, которую я сделал, чтобы сделать 8 символов длиной (ну, 10, чтобы включить \ 0) строку из 0 и 1, чтобы показать мне содержимое 8-битной переменной типа char. (IE, я даю ему номер 13, он возвращает строку "0001101 \ 0")

Когда я использую код, приведенный ниже, он печатает! {Счастливое лицо] 6 раз (ну, второй - почему-то одно только счастливое лицо), каждое возвращение возвращается как 0xDEAE или "! \ X02.

Я думал, что он разыменовывает и возвращает соответствующую строку, но, похоже, он просто отправляет указатель и пытается его проанализировать. Это может показаться глупым, но мой опыт на самом деле был в C ++ и Java, поэтому возвращение к C поднимает несколько проблем, которые были решены в более поздних языках программирования, с которыми я не совсем уверен, как справиться (например, отсутствие строки переменные).

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

В настоящее время он настроен так:

это отрывок из основного ()

display[0] = '\0';
for(i=0;i<6;i++)
{
     sprintf(s, "%s ", *char_to_bits(buffer[i]));
     strcat(display, s);
}
DispStr(8,5, display);

и это оскорбительная функция:

char *char_to_bits(char x)
{
     char bits[16];
     strcpy(bits,"00000000\0");
     if (x & 0x01)
         bits[7]='1';
     if (x & 0x02)
         bits[6]='1';
     if (x & 0x04)
         bits[5]='1';
     if (x & 0x08)
         bits[4]='1';
     if (x & 0x10)
         bits[3]='1';
     if (x & 0x20)
         bits[2]='1';
     if (x & 0x40)
         bits[1]='1';
     if (x & 0x80)
         bits[0]='1';
     return bits;
}

и просто ради завершения, другая функция используется для вывода в окно stdio в определенном месте:

void DispStr(int x, int y, char *s)
{
     x += 0x20;
     y += 0x20;
     printf ("\x1B=%c%c%s", x, y, s);
}

Ответы [ 4 ]

4 голосов
/ 02 апреля 2010

Вот проблемы, которые я вижу:

  • Функция char_to_bits возвращает char массив bits, что local. Так что его память будет потеряна, как только функция возвращает. Чтобы решить это выделять память для бит динамически используя malloc и позже освободите его используя функцию free или вы можете сделать это static или объявить bits глобально.
  • Вам не нужно разыменовывать вызов char_to_bits в sprintf. Так изменить
    sprintf(s, "%s ", *char_to_bits(buffer[i]));

    до

    sprintf(s, "%s ", char_to_bits(buffer[i]));

2 голосов
/ 02 апреля 2010
char * func()
{
  char *str = malloc (string_size * sizeof(char));
  strncpy (str, "Hello World", string_size);
  return str;
}


main()
{
  char *str = func();
  printf ("%s\n", str);
  free(str);
}
1 голос
/ 02 апреля 2010

Ваша проблема в том, что char bits[16]; является локальным для функции char_to_bits, поэтому при возврате он указывает на недопустимое расположение в стеке. Вы должны передать в буфер, который вы хотите заполнить строкой. Вот так:

char * char_to_bits(char x, char * bits)
{
     strcpy(bits,"00000000\0");
     ...
     return bits;
}

и звонок вот так:

 char bits[16];
 sprintf(s, "%s ", char_to_bits(buffer[i], bits));

В этом отношении Dynamic C ( this? ) ведет себя так же, как C здесь. Это распространенная ошибка, которую допускают люди, привыкшие к строкам Java / C ++. «Строка» C - это просто указатель на данные, а не объект.

0 голосов
/ 02 апреля 2010

Возможно, проблема в том, что ваш массив bits[] из char *char_to_bits(char x) объявлен локально, объявите его глобально.

Пожалуйста, попробуйте эту программу, я протестировал ее с помощью компиляторов Mingw и Borland / CodeGear, и она работает:

#include <stdio.h>
#include <string.h>

using namespace std;

//Declare bits[] globally
char bits[16];

//Your char to bit function
char* char_to_bits(char x)
{

     strcpy(bits,"00000000\0");
     if (x & 0x01)
         bits[7]='1';
     if (x & 0x02)
         bits[6]='1';
     if (x & 0x04)
         bits[5]='1';
     if (x & 0x08)
         bits[4]='1';
     if (x & 0x10)
         bits[3]='1';
     if (x & 0x20)
         bits[2]='1';
     if (x & 0x40)
         bits[1]='1';
     if (x & 0x80)
         bits[0]='1';
     return bits;
}

int main()
{
    //Testing char_to_bits() by writing word "Test" in binary

    char test[] = "Test";

    for(int i = 0; i < strlen(test); i++)
    {
        printf("%s ", char_to_bits(test[i]));
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...