Четверг, 25 Апреля 2024, 15:26

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 3 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Форум игроделов » Программирование » C/C++ » Массивы и метки в C++
Массивы и метки в C++
KornivalДата: Вторник, 30 Августа 2011, 19:32 | Сообщение # 41
The Witcher
Сейчас нет на сайте
мой код увеличивает значение первого элемента в массиве а на единицу. Твой код из последнего поста присваивает указателю b адресс второго элемемта из массива а.

Сообщение отредактировал Kornival - Вторник, 30 Августа 2011, 20:55
05142Дата: Вторник, 30 Августа 2011, 19:36 | Сообщение # 42
постоянный участник
Сейчас нет на сайте
мой код какбы работающая версия a = a +1; извращение правда.

mecinvader
froexДата: Вторник, 30 Августа 2011, 23:54 | Сообщение # 43
Руководитель Froexilize team
Сейчас нет на сайте
Да поймите вы.
Если объявлен указатель на некий тип данных, то увеличение этого указателя на единицу изменяет адрес, хранящийся в этом указателе на размер в байтах типа указателя.
Пример 1:
int *a; // указатель на целое число. a+1 даст нам адрес "a" плюс 4 байта.
Пример 2:
char *c; // указатель на символ. c+1 даст нам адрес "c" плюс 1 байт.

Могу ещё привести пример. Допустим, что изобретём велосипед и напишем свою функцию копирования строки. Тут и массивы используются, и разыменования, и приращение адресов. Чтобы после приращения адресов нам не терять начало выделенной области памяти, мы сохраняем значение указателя в ещё одной переменной.
Code
#include <iostream>
#include <string.h>
#include <stdlib.h>

char *string_copy(char *src, char* dst)
{
   char *res = dst;
   while(*dst++=*src++);
      *dst=0;
      return res;
}

int main()
{
      char *string1 = "temp string";
      char *string2;
      std::cout << string1 << std::endl;
      string2 = (char*)malloc(sizeof(char)*(unsigned)strlen(string1));
      std::cout << string_copy(string1, string2) << std::endl;
      return 0;
}

Добавлено (30.08.2011, 23:54)
---------------------------------------------
Я уже показывал, что такое массив. Не спрашивайте меня, где он тут в коде - должно быть и так ясно.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.


Сообщение отредактировал froex - Вторник, 30 Августа 2011, 23:53
noTformaTДата: Среда, 31 Августа 2011, 00:00 | Сообщение # 44
Ukrainian independent game developer
Сейчас нет на сайте
froex, я (и тот парень который написал статью на гд.ру) привел доказательство того что массив - это никакой не указатель, ведь если бы он был указателем, то
int a[10];
a = a + 1;
Спокойно бы скомпилировалось и выполнилось, но как известно - оно не скомпилировалось, про выполнение молчу.
Работает только вот такой способ:
int a[10]; //массив из 10 элементов
int *p = a; //неявное преобразование массива к указателю на его первый элемент.
p = p + 1; //такое с массивом не проканает, а = а + 1 не канает smile

Тут кто то говорил мне что массив (его имя) является указателем, кто? мне влом искать, но смотря на примеры выше - уже понятно что массив а - не указатель.


@noTformaT
froexДата: Среда, 31 Августа 2011, 00:04 | Сообщение # 45
Руководитель Froexilize team
Сейчас нет на сайте
Массив - это структура данных всего-лишь. Я не знаю, кто говорил, что это указатель.

Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
ComentДата: Среда, 31 Августа 2011, 00:13 | Сообщение # 46
почетный гость
Сейчас нет на сайте
Вроде писали что имя массива - это указатель на первую его ячейку. А так интересный спор. Слежу с удовольствием cool
froexДата: Среда, 31 Августа 2011, 00:18 | Сообщение # 47
Руководитель Froexilize team
Сейчас нет на сайте
Quote (noTformaT)
int a[10];
a = a + 1;

Ну конечно не компилируется. Надо осознавать разницу между именующими и значащими выражениями: lvalue = rvalue. Иначе присвоения никак не может быть.

Добавлено (31.08.2011, 00:18)
---------------------------------------------
Если не ошибаюсь, то по значащим и именующим выражениям можно почитать справочник Рей Лишнера по С++, страницы 80-90. Помню только, что до сотой :Р


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.


Сообщение отредактировал froex - Среда, 31 Августа 2011, 00:18
noTformaTДата: Среда, 31 Августа 2011, 00:24 | Сообщение # 48
Ukrainian independent game developer
Сейчас нет на сайте
Quote (Coment)
Вроде писали что имя массива - это указатель на первую его ячейку.

используя имя массива компилятор неявно приводит его к указателю на первую ячейку, это в том случае если имя массива передают указателю. Что то типа:
int a[10];
int *b = a; //тут передаем имя массива указателю,

или

int a[10];
void MyFunc( int *arr ) {};
MyFunc(a); //тут тоже передаем имя указателю.

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

Quote (froex)
Ну конечно не компилируется. Надо осознавать разницу между именующими и значащими выражениями: lvalue = rvalue. Иначе присвоения никак не может быть.

Вот это не понял. я говорил про массив == указатель, что на самом деле равно фалсе smile Причем тут значащие и именующие я как то не понял. Ведь если а - указатель на первую ячейку массива, то почему мы не можем ничего сделать с этим указателем?


@noTformaT
froexДата: Среда, 31 Августа 2011, 00:38 | Сообщение # 49
Руководитель Froexilize team
Сейчас нет на сайте
noTformaT, ладно, я относительно недавно приехал домой, поэтому не в состоянии сильно задумываться. Можно продолжить разговор в следующий раз. Я обговорю ещё эту тему со своим руководителем. Потом сообщу результаты разборов. Спасибо за интересную беседу.

Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
FenMixДата: Среда, 31 Августа 2011, 00:47 | Сообщение # 50
Независимый игровой журналист
Сейчас нет на сайте
Кстати, насчет goto smile В бейсике и то лучше юзать подпрограммы. FunctionName() и вуаля! smile
froexДата: Среда, 31 Августа 2011, 01:01 | Сообщение # 51
Руководитель Froexilize team
Сейчас нет на сайте
Я как-то рассматривал задачи поиска дефектов кубических и многопространственных объектов. При нахождении дефекта выход из поиска очень сложно осуществить посредством break-операторов. Без goto я мог обойтись только с трудом. goto облегчило алгоритм.

Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
nilremДата: Среда, 31 Августа 2011, 01:19 | Сообщение # 52
Просветленный разум
Сейчас нет на сайте
noTformaT,
с именем массива нельзя ничего сделать потому, что он не простой указатель, а константный.


Windmill 2

WindMill 2D Game Engine
noTformaTДата: Среда, 31 Августа 2011, 10:44 | Сообщение # 53
Ukrainian independent game developer
Сейчас нет на сайте
Quote (nilrem)
с именем массива нельзя ничего сделать потому, что он не простой указатель, а константный.

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


@noTformaT
KornivalДата: Среда, 31 Августа 2011, 15:23 | Сообщение # 54
The Witcher
Сейчас нет на сайте
Насчет массивов froex абсолютно прав, тем кто с ним не согласен будет достаточно посмотреть дизассемлированный листинг любого из приведенных выше примеров. Мне уже не удобно если честно, но все равно спрошу еще раз: где там используется динамичесая память? Или ты понял что ошибся? Или решил меня игнорировать?
noTformaTДата: Среда, 31 Августа 2011, 15:26 | Сообщение # 55
Ukrainian independent game developer
Сейчас нет на сайте
Quote (Kornival)
достаточно посмотреть дизассемлированный листинг любого из приведенных выше примеров.

ммм, нет дазасемблера под рукой, расскажи в двух словах smile


@noTformaT
KornivalДата: Среда, 31 Августа 2011, 16:06 | Сообщение # 56
The Witcher
Сейчас нет на сайте
Quote (noTformaT)
ммм, нет дазасемблера под рукой, расскажи в двух словах

Code

int main()
{
      int i = 12;            
      int aray[4];
      array[0] = 1;
      array[1] = 2;
      array[2] = 3;
      *(array+2) = 4;
}

array является указателем на область памяти где находится первый эелемент нашего массива, адреса остальных элементов вычисляются относительно него. Точный код не дам, но если убрать шелуху получится что-то вроде
Code
   
mov ebp, esp      ;сохранение регистра стека
sub esp, 18         ;выделяем в стеке 24 байт для массива и переменной i   
mov [ebp], 0x0000000c   ;ebp указывает на адресс первого байта который мы выделили для переменных функции main   
mov [ebp-4],1                 ;а это фактическа указатель array
mov [ebp-8],2                 ;дальше все по смещению относительно array
mov [ebp-c],3
mov [ebp-e],4


Сообщение отредактировал Kornival - Среда, 31 Августа 2011, 16:07
froexДата: Среда, 31 Августа 2011, 17:41 | Сообщение # 57
Руководитель Froexilize team
Сейчас нет на сайте
Kornival, динамической памяти нет. Есть динамическое выделение. И попробуй использовать более старые компиляторы для проверки. Да, я игнорирую твой вопрос, т.к. не знаю, как сформулировать. Смысл в том, что старые компиляторы могут не ухватить цикла и не сохранять значения регистров перед безусловным переходом. Также они могут снова выделить память под массив. Память будет выделена по новому адресу тогда, т.к. старый занят.
Я проверил на gcc 4.5.2 - он нормально пашет. Другого компилятора под рукой нет. Мой руководитель тоже считает то объявление проблемным местом и посоветовал объявить его как static.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
KornivalДата: Среда, 31 Августа 2011, 18:03 | Сообщение # 58
The Witcher
Сейчас нет на сайте
Quote (froex)
Kornival, динамической памяти нет.

Есть в адрессном пространстве процесса сегмент "куча"(heap), когда нужно выделить или освободить память динамически она выделяется или освобождается именно в этом сегменте. В нашем случае память выделяется в стеке(инфа 100%), а такая память наз-ся "статической". И вообще, забьем на это smile


Сообщение отредактировал Kornival - Среда, 31 Августа 2011, 18:06
froexДата: Среда, 31 Августа 2011, 18:26 | Сообщение # 59
Руководитель Froexilize team
Сейчас нет на сайте
Кстааааати. Насчёт goto. Осмелюсь привести цитату из книги.

"Ученые - это мальчики и девочки, которые считают себя последователями Бэббиджа и Тьюринга. Никогда в жизни они не вставят в код инструкцию GoTo. Отодвигая художественную составляющую программирования на второй план, они делают все в соответствии с фундаментальными принципами компьютерных наук. И как раз в этом обычно и заключается проблема. В то время как они одержимы безупречностью своих трудов, ваша главная забота как руководителя состоит в том, чтобы разработать доброкачественный продукт и сдать его к установленному сроку. Программисты такого типа на самом деле очень полезны, и когда речь заходит об особо трудных задачах кодирования, их идеям нет цены. Вы просто долны следить за тем, чтобы их педантичность не перевесила практические соображения. У инженеров и ученых есть одна общая черта - те и другие очень любят все усложнять. Иногда даже кажется, что они все поклоняются богу сложности (и даже приносят ему жертвы!). Отдавая должную оценку глубочайшим познаниям ученых и по мере необходимости обращаясь к ним, руководитель не должен допускать их полновластия в вопросах написания кода - иначе они сделают его слишком сложным." (с) Дж. Ханк Рейнвотер "Как пасти котов".


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.


Сообщение отредактировал froex - Среда, 31 Августа 2011, 18:27
BOOMДата: Понедельник, 03 Октября 2011, 15:19 | Сообщение # 60
I am the creator of ADE
Сейчас нет на сайте
Quote (4aBo)
Привет, сейчас мы рассмотрим массивы и метки, массивы - это своеобразные стопки в одной переменной, массивы в языке С++ задаются так, сначала вызывается обычная переменная, только со скобками [], внутри которых нужно прописать количество значений в стопке, например, можно написать:

В C++'е не существуют переменные. Каждый объект (а именно так "переменная называется") при начале функции (процедуры) создаётся, а при завершении процедуры этот объект удаляется.
О массивах: массив - это множество ссылок на объект, либо множество объектов.

4aBo, goto - оператор прошлого. Он, хотя и остаётся в поддержке стандартов C++'а, но во многих компиляторах его реализация выполнена скверно, либо вообще отсутствует. Я не советую в проектах на C++ использовать оператор goto.


______________________________
Я вернулся, и это чудо.
______________________________
Форум игроделов » Программирование » C/C++ » Массивы и метки в C++
  • Страница 3 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг