Передать строку многомерного массива в качестве параметра

Моя программа на 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], но не того типа? Или проблема в компиляторе?

Пожалуйста, опубликуйте свой код

Gunther Schulz 05.02.2019 06:59

«это был Турбо С++». Это ваша проблема прямо здесь. Почему вы используете кусок программного обеспечения, которое уже устарело в прошлом тысячелетии?

n. 1.8e9-where's-my-share m. 05.02.2019 07:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
89
1

Ответы 1

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 - Вам не обязательно следовать совету по выбору современного компилятора. Но я буду упущен, если не упомяну об этом.

StoryTeller - Unslander Monica 05.02.2019 07:27

Я просто возился с виртуальной машиной DOS, и единственным компилятором C, который я мог придумать для DOS, был Turbo. Итак, я полагаю, что предупреждение было просто проблемой компилятора ... Я буду избегать его, хотя для чего-то серьезного, тем более, что оно кажется склонным к сбоям.

Heimdall 05.02.2019 07:32

@Heimdall - Кроме того, C претерпел изменения с момента последнего серьезного обновления TurboC. Вам будет не хватать многих современных способов написания ясного и выразительного кода. Еще один момент для рассмотрения.

StoryTeller - Unslander Monica 05.02.2019 07:34

Я также не знаю, почему вы хотите программировать для дос, но вы можете сделать разработку для винды. Microsoft предлагает версию сообщества Visual Studio. Это намного лучше, чем TurboC, и вам не нужно возиться с виртуальной машиной.

StoryTeller - Unslander Monica 05.02.2019 07:36

Я знаю, она довольно старая, версия 3. Но я просто возился с чем-то быстрым, что было под рукой, а программа представляла собой простую командную строку с отображением текста.

Heimdall 05.02.2019 07:41

Даже Windows SDK 7.1 предоставит вам компилятор VS2010 (менее 1G), который примерно на 21 год старше, чем TurboC, как и MinGW (который предоставит gcc 6.X)

David C. Rankin 05.02.2019 08:18

Другие вопросы по теме