#c #arrays
#c #массивы
Вопрос:
Я работаю с демонстрационной программой, написанной кем-то другим, и я очень смущен некоторыми инструкциями, которые они используют. Я не очень хорошо знаком с C (особенно с Obj-C), и я не уверен, является ли это допустимым кодом или нет. Возьмем, к примеру, следующее: (комментарии мои)
int main(int argv, char** argc)
{
int perm [20]; //OK, so declare an array of ints, size = 20
for (int i=0; i < 20; i )
perm = i; //whaaaaa??? thought you need to specify an element to assign to an array...
}
Это один из примеров — мой компилятор выдает ошибку «несовместимые типы при присвоении ‘int’ значению ‘int [20]», но, по-видимому, другие смогли скомпилировать программу. Я спятил, или это плохой код?
Вот еще одна часть, которую я просто не понимаю:
int d[20] = {0}; //OK, another int array of size 20, initialized to 0's
for (int i = 1; i < n; i )
{
d = d[i - 1]; //this I don't get - assign the array to one of its own elements??
if (invperm[i - 1] < b)
d ; //this would just increment to the next element?
}
Я подозреваю, что ошибка связана с пониманием с моей стороны, как если бы код был плохим, другие люди прокомментировали бы этот факт … если у кого-нибудь есть хорошее объяснение и / или ресурс, который я могу прочитать, чтобы понять это, я был бы очень признателен!
Спасибо!
* ОТРЕДАКТИРОВАНО Для ДОБАВЛЕНИЯ*
В ответ на приведенные ниже ответы я скопировал / вставил этот код, и для меня он выглядит неповрежденным…Я могу только предположить, что когда оригинальный автор опубликовал его, он каким-то образом исказил его. Спасибо за ответы, я рад, что у меня было правильное понимание, и я попытаюсь связаться с автором, чтобы узнать, есть ли где-нибудь неповрежденная копия!
Комментарии:
1. Откуда, черт возьми, вы это взяли? Это прямое копирование и вставка?
Ответ №1:
Все эти примеры абсолютно неверны. Похоже, вы проиграли [i]
, когда скопировали код оттуда, откуда вы его взяли.
Я видел нечто подобное с кодом, отправляемым через программы Messenger, которые обрабатывают определенные фрагменты текста как эмоции и заменяют их изображениями, которые не копируются как текст, а вместо этого удаляются.
Комментарии:
1. Это более вероятно, но решение то же самое: получите фактический файл, не копируйте и не вставляйте текст.
2. Спасибо, похоже, автор кода, должно быть, скопировал / вставил, и [i], рассматриваемый как html-тег, звучит именно так, как и произошло!! Я свяжусь с ним, чтобы узнать, есть ли у него исходный файл…
Ответ №2:
С вашим пониманием все в порядке, этот код просто совершенно бессмысленный.
d ; //this would just increment to the next element?
Это было бы, если бы d
был указатель. Однако, поскольку d
это массив, это просто незаконно.
Комментарии:
1. Подождите, разве массивы и указатели в основном не одинаковы? Шучу ! 😉
Ответ №3:
Это, безусловно, ошибка копирования / вставки. Я поддался искушению скопировать / вставить код в какой-то момент во время игрового технологического проекта с использованием скриптов Lua. Если скрипт Lua завершается с ошибкой, нет обратной связи / вывода, указывающих на сбой чего-либо (что очень расстраивает). После многочасовой отладки я понял, что мой скрипт использует «умные кавычки».
Хотя этот код не работает, он все еще может научить вас некоторым вещам о C .
int perm [20];
cout << endl << perm << endl;
cout << endl << amp;perm[0] << endl;
‘perm’ возвращает адрес памяти первого элемента массива. итак, когда вы пытаетесь присвоить ‘i’ значению ‘perm’ в этом основном цикле for (20 раз), теперь вы будете знать, что вы пытались присвоить целое число адресу памяти, отсюда и ошибка несовместимого типа.
Однако второй раздел сильно нарушен, и я не могу извлечь из этого много уроков: P.
Я добавил в пример программу, чтобы показать, как можно использовать указатели / массивы:
#include <iostream>
using namespace std;
int main()
{
int d[20] = {0}; // 20 ints, set to 0
int * ptr = d; // points to d[0]'s memory address
for(int i = 0; i < 20; i )
{
d[i] = 0 i; // set array values
}
for(int i = 0; i < 20; i )
{
// iterates through d and prints each int
cout << endl << "d[i]: " << d[i] << endl;
// dereferences the ptr to get the same int
// then incraments the position of the pointer for next time
cout << endl << "*ptr : " << *ptr << endl;
}
getchar();
return(0);
}