Моя программа на C имеет трехмерный массив, определенный как int origF [6][6][4]. У меня также есть функция void displayPM (int tile []), которой я передаю origF [i][j] в качестве аргумента, что логически имеет смысл. Работает как надо (когда displayPM читает tile [k] получает значение origF [i][j][k]. Однако компилятор (в VirtualBox был Turbo C++) выдает предупреждение Подозрительное преобразование указателя с пояснением: Компилятор обнаружил некоторое преобразование указателя, из-за которого указатель указывал на другой тип. Вы должны использовать приведение, чтобы подавить это предупреждение, если преобразование правильное.
Понимая, что так же, как и одномерный массив, многомерный массив — это всего лишь указатель на начало данных, какой тогда тип origF [i][j]? Поскольку он работает правильно, это все еще указатель, и он указывает на origF [i][j][0], но не того типа? Или проблема в компиляторе?
«это был Турбо С++». Это ваша проблема прямо здесь. Почему вы используете кусок программного обеспечения, которое уже устарело в прошлом тысячелетии?





Realising that just like one-dimensional array, a milti-dimensional array is just a pointer to the beginning of the data
Нет. Не в случае с одним многомерным массивом или. Массивы является блок данных. Это не указатель. Он выполняет конвертировать для указателя на первый элемент при использовании в большинстве других выражений (даже origF[i] на самом деле является *(origF + i)), но сам по себе не является указателем.
origF — это массив. Когда вы индексируете его, он преобразуется в указатель на массив для этой цели. Он становится int (*)[6][4]. Вы также можете создавать такие указатели.
int (*p)[6][4] = origF; // Here origF is decaying to a pointer to its first element.
И при его разыменовании получается выражение типа массива int[6][4]. Это также происходит "рекурсивно" для любого необходимого количества измерений.
Итак, вернемся к вашему примеру, вы хотели узнать, что такое origF [i][j]. Это выражение имеет тип массива. Тип int[4]. Когда вы передаете его функции, он автоматически конвертируется в int*.
Это на уровне языка, о чем авторы компилятора в то время не знали. Никаких подозрительных преобразований не происходит. Единственные подозрения должны быть направлены на того, кто запрограммировал это предупреждение. На самом деле он предлагает вам добавить приведение (то есть просто отключить его) и потенциально сломать вашу программу. Не то чтобы в том, что вы сделали, опять же, что-то не так, но в целом это очень плохой совет.
В любом случае, поскольку поддержка TurboC прекращена, лучше использовать современный компилятор. GCC и Clang являются бесплатным программным обеспечением и программным обеспечением с открытым исходным кодом соответственно, и у них очень высокий QoI. Вы должны дать им взглянуть.
@Heimdall - Вам не обязательно следовать совету по выбору современного компилятора. Но я буду упущен, если не упомяну об этом.
Я просто возился с виртуальной машиной DOS, и единственным компилятором C, который я мог придумать для DOS, был Turbo. Итак, я полагаю, что предупреждение было просто проблемой компилятора ... Я буду избегать его, хотя для чего-то серьезного, тем более, что оно кажется склонным к сбоям.
@Heimdall - Кроме того, C претерпел изменения с момента последнего серьезного обновления TurboC. Вам будет не хватать многих современных способов написания ясного и выразительного кода. Еще один момент для рассмотрения.
Я также не знаю, почему вы хотите программировать для дос, но вы можете сделать разработку для винды. Microsoft предлагает версию сообщества Visual Studio. Это намного лучше, чем TurboC, и вам не нужно возиться с виртуальной машиной.
Я знаю, она довольно старая, версия 3. Но я просто возился с чем-то быстрым, что было под рукой, а программа представляла собой простую командную строку с отображением текста.
Даже Windows SDK 7.1 предоставит вам компилятор VS2010 (менее 1G), который примерно на 21 год старше, чем TurboC, как и MinGW (который предоставит gcc 6.X)
Пожалуйста, опубликуйте свой код