Передача массива char * в другую функцию, проблема с указателем в c - PullRequest
0 голосов
/ 07 февраля 2012

Эй, у меня проблемы с получением правильного значения, хранящегося в массиве CHANNELS. Я действительно думаю, что это может быть простая проблема с моими указателями. Я «думаю», что понимаю, что когда вы объявляете char * CHANNELS [6], вы создаете массив указателей. так что я передаю в моем случае оператора переключателя 1 КАНАЛЫ в третьем аргументе, я не получаю правильное значение обратно. Любая помощь это здорово! Некоторый фон: я читаю в 6 "каналах", каждый из которых имеет 6 двоичных значений.

void binEnter(void *channel, char *CHANNELS[6], int i){
redo:
    printf("Enter binary value for Channel %d: ",i);
    scanf("%s",(UCHAR *)channel);
    if (strlen(channel)!=6) {
        printf("Error entry must be six digits!\n");
        goto redo;
    }
    char *string = channel;
    int j;
    for (j = 0; j < 6; j++){
        if ((string[j] != '0') && (string[j] != '1')){
            printf("Error did not enter a binary number!\n");
            goto redo;
        }
    }
CHANNELS[i]=channel;
printf("Channel %d is stored as %s\n",i,CHANNELS[i]);

}

int main(){
int selection;
UCHAR channel0;
UCHAR channel1;
UCHAR channel2;
UCHAR channel3;
UCHAR channel4;
UCHAR channel5;
char *CHANNELS[6];
float vRefVal[6];
//char *data[5];
float volt =0;
do {
start:
    promptUser();
    scanf("%d",&selection);
    switch (selection) {
        case 1:
            binEnter(&channel0, CHANNELS,0);
            binEnter(&channel1, CHANNELS,1);
            binEnter(&channel2, CHANNELS,2);
            binEnter(&channel3, CHANNELS,3);
            binEnter(&channel4, CHANNELS,4);
            binEnter(&channel5, CHANNELS,5);
            int i;
            for (i=0; i<6; i++) {
                printf("Channel %d is %s in main\n", i, CHANNELS[i]);
            }
            goto start;

        case 2:
            goto start;
        case 3:
            enterVolt(&volt);
            printf("Volt = %f\n",volt);
            goto start;
        case 4:
            if (volt) {
                vRefCal(&volt, CHANNELS, vRefVal);
                printVref(vRefVal);
                goto start;
            }
            else{
                printf("Must enter input Vref first!\n");
                goto start;
            }
        default:
            break;
    }
} while (selection!=5);
return 1;
}

1 Ответ

0 голосов
/ 07 февраля 2012

UCHAR channel0;

вы прошли как

binEnter(&channel0, CHANNELS,0);

Прототип bitEnter равен void binEnter(void *channel, char *CHANNELS[6], int i)

Но тогда вы делаете: scanf("%s",(UCHAR *)channel);

  1. Почему вы передаете его как void *, если собираетесь обрабатывать его как строку?
  2. Вы пытаетесь ввести строку, тип которой равен UCHAR (который я предполагаю, чтобы быть беззнаковым символом). Выполнение этого перезапишет память, начиная с базы адреса, хранящейся в channel, и в зависимости от того, как память была выделена для автоматических переменных, они будут перезаписаны, неопределенное поведение.

Попробуйте динамически выделить строки, которые вы вводите в функции bitEnter, а затем добавьте их в CHANNELS?

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