Присвоение символа * символу - PullRequest
0 голосов
/ 21 сентября 2018

Так что я очень плохо знаком с C и только начинаю использовать указатели.Я использую 2D-массив для преобразования набора строк из шестнадцатеричного в десятичное, буква за буквой.Тем не менее, в процессе, я должен взять первый символ каждой строки, и для этого я пытаюсь присвоить их символу.Эта строка, в частности, доставляет мне неприятности.

aChar = input[j][i];

В ней все время говорится, что я не могу конвертировать из const char * в char, но, как бы я ни изменил его, я не могу заставить его работать.

Вот полная программа:

#include <stdio.h>
#include "catch.hpp"
#include <unistd.h> 
TEST_CASE("Listing 2.2")
{
    int x; 
    int j = 0;
    int i = 0;
    x = 0; 
    const int N = 8;
    char aChar;
    const char* input[N][5] = {"a000", "ffff", "0400", "1111", "8888", "0190", "abcd", "5555"};
    int answers[N] = {40960, 65535, 1024, 4369, 34952, 400, 43981, 21845};
    for (j=0; j>N; j++){
        for(i=0; i>5; i++){
            aChar = input[j][i];
            x = x << 4;                  
            if (aChar <= '9') 
            { 
                x = x + (int)(aChar & 0x0f); 
            } 
            else 
            { 
                aChar = aChar & 0x0f; 
                aChar = aChar + 9; 
                x = x + (int)aChar; 
            }
            CHECK(answers[j] == x); 
        }//end for 1
    }//end for 2 
    printf("End of program.\n"); 
}

Любая помощь будет оценена!

Ответы [ 5 ]

0 голосов
/ 21 сентября 2018

aChar = input [j] [i];В этом операторе вы пытаетесь присвоить адрес постоянного указателя char . Это неверное утверждение.

Вам нужно сослаться на переменную указателя, а затем присвоить соответствующийпеременная, вы можете изменить оператор как, aChar = * input [j] [i];

0 голосов
/ 21 сентября 2018

Вы использовали неправильное условие для ваших циклов for.Вы инициализировали переменную цикла (i/j) с 0, но просите, чтобы циклы были прерваны, если i/j больше, чем 5/N.Если вы хотите перебрать весь двумерный массив, он должен выглядеть следующим образом: ('<' вместо '>')

for (j=0; j<N; j++){
    for(i=0; i<5; i++){
    //... your code
    }//end for 1
}//end for 2 
0 голосов
/ 21 сентября 2018

Вот виновник:

const char* input[N][5] = {"a000", "ffff", "0400", "1111", "8888", "0190", "abcd", "5555"};

Вы хотите объявить массив до 8 строк размером 5 (4 цифры + завершающий ноль), но на самом деле объявить массив из 8 массивов из 5 указателей.

То, что вы хотите:

const char input[N][5] = {"a000", "ffff", "0400", "1111", "8888", "0190", "abcd", "5555"};
0 голосов
/ 21 сентября 2018

Я использую 2D-массив

Чтобы использовать 2D-массив char, вы должны объявить: const char input[N][5].const char* input[N][5] является 2D-массивом char* (вместо массива строк вы получаете 2D-массив строк).

Учитывая ваше объявление, неудивительно, что aChar = input[j][i]; приводит к присваиваниюchar* до char, что является ошибкой.

0 голосов
/ 21 сентября 2018

input - это двумерный массив указателей на символы.Эффективно он имеет 3 измерения.Два измерения строк N * 5 и третье измерение будут проходить символы в каждой строке.

const char* input[N][5]

Если вы хотите первый символ каждой строки, вам нужно использовать

aChar = input[j][i][0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...