Current time: 14.04.2024, 08:01 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
С++, общая тема
Author Message
Efrit Offline
Administrators

Posts: 6183
Post: #61

etoprostoya, ну и где здесь функция? Spiteful


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
23.01.2012 12:30
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #62

Quote:Пакка, ты внимательно читаешь мои сообщения? Rolleyes Я же прямо указал тебе в сообщении 55, что ошибка связана со строкой Img[i]=new TImage(this) - она слишком низко стоит, ты создаёшь объект после обращения к нему. Даже пурпурным цветом её тогда выделил Ab
Гм, не знаю по какой причине, но я прочитал только это))) :

Quote:Частично я уже указал тебе на твою ошибку, смотри пункт 3 моих рекомендаций. Ты не заполняешь в массиве bh элементы вида bh[i][0] числами, и поэтому они принимают значение по умолчанию - то бишь 0. Поэтому, строчка с case 0 всегда срабатывает уже для самого первого элемента массива bh (то бишь, для bh[0][0]). А что в ней происходит? Ты пытаешься (через указатель) обратиться к элементу, который ещё не создан!
Вследствие чего не совсем допонял, и сделал неправильный вывод.
Quote:Кстати, а ты вообще понимаешь, что именно делает эта строка?

Теперь да, тогда нет Sm
Точнее догадаться мог, это довольно просто, но я просто не обращал на нее внимания. Да, мне стыдно...


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
23.01.2012 13:51
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #63

(23.01.2012 12:30)Efrit Wrote:  etoprostoya, ну и где здесь функция? Spiteful

А по существу? Добавь оболочку для функции, которая не влияет на саму возможность обращаться к элементам массивов без использования адресной арифметики.
Code:
void function(void)
{
     for(int i = 0; i < 32; i++)
          for(int k = 0; k < 32; k++)
          {
               int tmp = arr[i][k];
               arr[i][k] = arr[k][i];
               arr[k][i] = tmp;
          }
}
23.01.2012 14:20
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #64

packa, теперь всё понятно Ab
И всё-таки, ради интереса ответь - что же именно, на твой взгляд, делается в той строке 118

etoprostoya, а где в твоей функции массив-то? arr - это какой-то конкретный глобальный массив, он не в счёт. А я, разумеется, имел в виду реализацию функции, которая транспонирует любой входной двумерный массив (любого размера)...


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
23.01.2012 14:37
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #65

Quote:NumImg=8;
Img=new TImage*[NumImg];
Резервируем место под 8 элементов
Quote:Img[i]=new TImage(this);
Создаем картинку (пустую), на данном элементе (на форме)
Quote:case 4 : Img[i]->Picture->LoadFromFile("14.bmp"); break;
Заполняем картинку картинкой)

Вот так я понял


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
23.01.2012 15:58
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #66

Про любой размер массива речи не было:
Quote:Ну-ка напиши мне функцию транспонирования квадратной матрицы без использования адресной арифметики.
Вот тебе код для двумерного массива любого размера:
Code:
int **arr;
void function(int H, int W)
{
      for(int i = 0; i < H; i++)
           for(int k = 0; k < W; k++)
           {
                int tmp = arr[i][k];
                arr[i][k] = arr[k][i];
                arr[k][i] = tmp;
           }
}
Опять придерёшься к чему-то, что не было оговорено? Sm
23.01.2012 16:08
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #67

(23.01.2012 07:47)Efrit Wrote:  Ну-ка напиши мне функцию транспонирования квадратной матрицы без использования адресной арифметики.
Code:
void foo(int **arr, int n)
{
     int tmp;
     for(int i = 0; i < n; i++)
          for(int k = i + 1; k < n; k++)
          {
               tmp = arr[i][k];
               arr[i][k] = arr[k][i];
               arr[k][i] = tmp;
          }
}
(23.01.2012 07:47)Efrit Wrote:  Или же, ещё лучше - какую-нибудь функцию с неизвестным числом переменных
а это тут причем? у Пакки в программе ими и не пахнет.
(23.01.2012 07:47)Efrit Wrote:  желательно строковых
так это только упрощает задачу
(23.01.2012 07:47)Efrit Wrote:  Неужели, по-твоему, C++-программист не должен знать про адресную арифметику?
почему в начальных классах не рассказывают матан?
(23.01.2012 07:47)Efrit Wrote:  Откуда такая категоричность?
плохое впечатление
(23.01.2012 11:35)Solmyr2000 Wrote:  я погуглил и нашёл, что ВСЁ во ВСЕХ языках программирования - зло. Деньги, кстати, тоже зло.
но в яп нет денег Bad


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
23.01.2012 17:23
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #68

packa, ты понял не совсем правильно. Команда new не просто "создала картинку" - она вызвала конструктор класса TImage, который как раз и создал объект "картинка", и затем вернула указатель на этот объект. Пойми, что Img - это массив указателей (причём ты его весьма коряво создаёшь, ну да ладно), а не массив объектов. А дальше ты просто обращаешься к объекту "картинка" (созданному конструктором) через указатель на него.
надеюсь, ты вообще знаешь, что такое "указатель"? Sm

etoprostoya, опять придерусь. Ну неужели ты так и не понял, что что функция должна транспонировать входной массив - то есть он должен как-то описываться среди входных параметров функции? Я же недаром даже выделил слово "входной" жирным (в своём предыдущем сообщении)... Ты же всё упорно пытаешься транспонировать какой-то левый глобальный массив arr - а нужно, чтобы функция транспонировала любой массив, а не только его (о чём я также писал выше).

gamecreator, ты пробовал запускать свою функцию? Напиши-ка ещё инициализацию входного массива и строчку вызова самой функции, ну чисто ради интереса Rolleyes

gamecreator Wrote:а это тут причем? у Пакки в программе ими и не пахнет.
Это я привёл пример, в реализации которого без указателей и адресной арифметики ну никак не обойтись. Или оспоришь? Spiteful

Quote:так это только упрощает задачу
Да ну! Ну давай, реализуй4

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

Quote:плохое впечатление
И что же там такого плохого? Неужели ты смотрел весь Буст целиком?


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
23.01.2012 18:23
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #69

Quote:Пакки
Респект дружище!)))

Quote:надеюсь, ты вообще знаешь, что такое "указатель"?
Слышал где то Rolleyes


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 23.01.2012 18:32 by packa.)
23.01.2012 18:24
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #70

(23.01.2012 18:23)Efrit Wrote:  ты пробовал запускать свою функцию?
честно - не пробовал. но не сомневаюсь в отсутствии семантических ошибок.
(23.01.2012 18:23)Efrit Wrote:  Напиши-ка ещё инициализацию входного массива и строчку вызова самой функции, ну чисто ради интереса Rolleyes
инициализация была в предыдущем куске кода. а foo(a,8); и писать нечего.
(23.01.2012 18:23)Efrit Wrote:  Это я привёл пример, в реализации которого без указателей и адресной арифметики ну никак не обойтись.
пример должен быть уместен. напомню, ты начал доказывать, что без вектора Пакке понадобится знать операции с указателями и адресную арифметику. доводов в подтверждение этого я еще не услышал.
(23.01.2012 18:23)Efrit Wrote:  Да ну!
ну да. указатель-то всегда 4 байта.
(23.01.2012 18:23)Efrit Wrote:  Ну давай, реализуй4
ок, будет.
(23.01.2012 18:23)Efrit Wrote:  Если человек хочет хорошо знать математику, то матан ему учить придётся.
но перед тем, как учить матан, необходимо еще много узнать. дай Пакке сначала научиться программировать, а потом уже учи его особенностям языка.
(23.01.2012 18:23)Efrit Wrote:  И что же там такого плохого? Неужели ты смотрел весь Буст целиком?
мне хватило попытки знакомства.


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
23.01.2012 18:50
Find all posts by this user Quote this message in a reply
Solmyr2000 Offline
Moderators

Posts: 4744
Post: #71

(23.01.2012 17:23)gamecreator Wrote:  но в яп нет денег Bad
:D Ну я имел в виду, что деньги-то зло, а всё равно нужны Sm
(This post was last modified: 23.01.2012 19:01 by Solmyr2000.)
23.01.2012 19:00
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #72

(23.01.2012 18:23)Efrit Wrote:  Ну давай, реализуй4
Code:
#include <stdio.h>
#include <string.h>

void multicat(char *dest, int n, ...)
{
    char **next = (char**) (&n + 1);
    dest[0] = 0;
    for(int i=0; i<n; i++, next++)
    {
        strcat(dest,*next);
    }
}

int main()
{
    char result[15];
    multicat(result,4,"123","45","6789","0");
    printf("%s\n",result);
    return 0;
}


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
23.01.2012 19:09
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #73

gamecreator Wrote:честно - не пробовал. но не сомневаюсь в отсутствии семантических ошибок.
инициализация была в предыдущем куске кода. а foo(a,8); и писать нечего.
Увы, ошибка.

Quote:пример должен быть уместен. напомню, ты начал доказывать, что без вектора Пакке понадобится знать операции с указателями и адресную арифметику. доводов в подтверждение этого я еще не услышал.
Как это "не услышал"? Сам же и написал функцию, которая принимает на входе указатель 96-copy

Quote:но перед тем, как учить матан, необходимо еще много узнать. дай Пакке сначала научиться программировать, а потом уже учи его особенностям языка.
Дык это ж не просто "особенность", это одна из его ключевых фич. "Особенности" - это уже больше свойства каких-то конкретных бибилиотек, типа той же STL (вот в ней у каждого контейнера есть свои особенности).

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

Quote:мне хватило попытки знакомства.
Ну и что именно-то тебе в нём не понравилось? 105 Блин, словно клещами информацию из тебя выжимаю...

P.S. За реализацию "второй" функции - респект, всё правильно.


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
23.01.2012 19:36
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #74

А нет, Игродел - вру, не ошибка. Но твоя функция транспонирования работает лишь в том случае, если объявлять массив a так:

Code:
int **a;
const m = 5;
const n = 5;
a = new int*[m];
for(int i = 0; i < m; i++) a[i] = new int[n];

Но в реальности так массивы объявляют редко. Намного чаще объявление происходит как:

Code:
int a[5][5] = {
{0, 1, 2, 3, 4},
{6, 0, 1, 2, 3},
{7, 6, 0, 1, 2},
{8, 7, 6, 0, 1},
{9, 8, 7, 6, 0}};

это я сразу же данный массив заполнить решил, хотя можно было и просто int a[5][5]; написать
Вот для такого объявления твой код работать не будет...

P.S. И ты ещё говоришь, будто "указателей в моём коде нету" - а сам при этом инициализируешь массив через new Ab
P.S. Да и вообще, пусть Пакка узнает, что понятие "массив" в С++ - это почти то же самое, что и "указатель" Ab (а вот обратное неверно)


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
23.01.2012 20:07
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #75

(23.01.2012 19:36)Efrit Wrote:  Как это "не услышал"? Сам же и написал функцию, которая принимает на входе указатель 96-copy
не просто указатель, а массив. да и это тут ни при чем. параметром функции он от этого быть не перестанет. а указатель там или что-то другое - без разницы, суть та же.
(23.01.2012 19:36)Efrit Wrote:  Ну и что именно-то тебе в нём не понравилось?
почем я помню? помню, что не понравилось
(23.01.2012 20:07)Efrit Wrote:  Вот для такого объявления твой код работать не будет...
надо было явно сказать что для статического. но арифметика указателей от этого не появится. хотя в универсальной функции уже будет не обойтись без работы с указателями:
Code:
void foo(void *p, int n, bool dynamic_array)
{
    int tmp;
    if(dynamic_array)
    {
        int **arr = (int**) p;
        for(int i = 0; i < n; i++)
        {
            for(int k = i + 1; k < n; k++)
            {
                tmp = arr[i][k];
                arr[i][k] = arr[k][i];
                arr[k][i] = tmp;
            }
        }
    }
    else
    {
        int *arr = (int*) p;
        int i1, i2;
        for(int i = 0; i < n; i++)
        {
            for(int k = i + 1; k < n; k++)
            {
                i1 = i*n+k;
                i2 = k*n+i;
                tmp = arr[i1];
                arr[i1] = arr[i2];
                arr[i2] = tmp;
            }
        }
    }
}
(23.01.2012 20:07)Efrit Wrote:  И ты ещё говоришь, будто "указателей в моём коде нету" - а сам при этом инициализируешь массив через new Ab
пруф. я такого не говорил. я говорил что выделение и освобождение памяти за работу с указателями не считаю.
(23.01.2012 20:07)Efrit Wrote:  Да и вообще, пусть Пакка узнает, что понятие "массив" в С++ - это почти то же самое, что и "указатель" Ab (а вот обратное неверно)
да-да, все массивы - указатели. а вот насчет обратного - я бы сказал, что это зависит от задач. в тех же функциях с произвольным числом параметров указатель, не являвшийся массивом, может им стать.


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
23.01.2012 21:20
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group