Присваивание неизвестных значений в массиве переменным

Итак, у меня есть массив из 9 целых чисел. Некоторые значения даны, некоторые неизвестны. Как мне присвоить этим неизвестным значениям целочисленную переменную, такую ​​как 'a' - 'z'? Например:

index [0] is unknown 
index [1] is 27 
index [2] is 6
index [3] is 9 
index [4] is unknown 
index [5] is 21 
index [6] is 24
index [7] is 3 
index [8] is unknown 

я хочу

index [0] is a
index [1] is 27 
index [2] is 6
index [3] is 9 
index [4] is b
index [5] is 21 
index [6] is 24
index [7] is 3 
index [8] is c






  for (ii=0; ii<MAXLINE/2; ii++)
  {
    if (uniqueNumbers[ii] == UNKNOWN_INPUT)
    {

      printf("UNKOWN_INPUT at [%d]\n", ii);
    }
  }

c
person foo    schedule 09.02.2011    source источник
comment
Как вы определяете неизвестное? Не-ноль?   -  person Marc B    schedule 10.02.2011
comment
Массив - это индексированная структура данных, содержащая элементы одного типа. Почему в вашем массиве комбинация int и char?   -  person Mahesh    schedule 10.02.2011
comment
Но что произойдет, если вам нужно поместить в массив отрицательные значения?   -  person Argote    schedule 10.02.2011
comment
Я работаю только с положительными числами   -  person foo    schedule 10.02.2011
comment
Итак ... чем ты закончил?   -  person Argote    schedule 10.02.2011


Ответы (5)


Поскольку вы, похоже, не используете отрицательные значения (вы отмечаете неизвестное с помощью -1), вы можете просто использовать отрицательное значение ASCII символов для хранения этой информации.

index [0] is a (-97)
index [1] is 27 
index [2] is 6
index [3] is 9 
index [4] is b (-98)
index [5] is 21 
index [6] is 24
index [7] is 3 
index [8] is c (-99)

При печати используйте (char)(-1 * index[i]).

person RedX    schedule 09.02.2011

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

Один из способов сделать это - сделать так, чтобы каждый из ваших элементов массива был объединением с тегами, например, этим:

typedef struct {
    enum { Constant, Variable } type;
    union {
        int value; // If this is a constant
        int* ref;  // If this is a reference to a variable
    } value;
} Expression;

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

Если это не совсем то, что вам нужно, вы можете легко внести изменения. Если вы хотите хранить символьные ссылки вместо жестких ссылок (например, чтобы сохранить, что запись является «переменной X» вместо «указателя на какое-то другое значение»), вы можете добавить другую перечисляемую константу и поле, содержащее имя Переменная.

person templatetypedef    schedule 09.02.2011
comment
К сожалению, анонимных союзов нет в C99. stackoverflow.com/questions/3228104 / - person Fred Foo; 10.02.2011

Это невозможно с массивом типа int. Вам, вероятно, следует определить небольшой struct с помощью int и char и сделать из него массив.

struct values {
    int value;
    char variable;
};

Затем вы должны назначить произвольный символ (скажем, ' ') для variable, если вы знаете значение value, или букву, если нет.

При использовании этого, если variable установлен в ' ' (или что вы определили), тогда прочтите значение value, в противном случае обработайте его как неизвестное.

person Argote    schedule 09.02.2011
comment
Я согласен с логикой, но разве здесь не уместнее союз? - person templatetypedef; 10.02.2011
comment
Ну да, я все же старался сделать это относительно простым. - person Argote; 10.02.2011

Расширяя ответ @ Argote, чистым решением является использование массива

struct Value {
    union {
        char var;
        int  i;
    } v;
    bool value_known;
};

Быстрый прием - использовать значения от -'a' до -'z' в качестве переменных. Это работает, только если ваши ценности всегда неотрицательны.

person Fred Foo    schedule 09.02.2011

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

person Community    schedule 09.02.2011