Присвоение неизвестных значений в массиве переменным - PullRequest
0 голосов
/ 10 февраля 2011

Хорошо, у меня есть массив из 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);
    }
  }

Ответы [ 5 ]

3 голосов
/ 10 февраля 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» вместо «указателя на какое-то другое значение»), вы можете добавить другую перечисляемую константу и поле, содержащее имяпеременная.

1 голос
/ 10 февраля 2011

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

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

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

1 голос
/ 10 февраля 2011

Это невозможно с массивом типа int. Вы, вероятно, должны определить маленький struct с int и char и создать массив этого.

struct values {
    int value;
    char variable;
};

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

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

0 голосов
/ 10 февраля 2011

Поскольку вы, кажется, не используете отрицательные значения (вы помечаете неизвестное -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]).

0 голосов
/ 10 февраля 2011

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

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