Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с массивами, Помогите с массивами 
:(
    Опции темы
OverloaD
Дата 7.11.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.11.2005

Репутация: нет
Всего: нет



Требуется в Си переписать значения одной матрицы в другую такого же размера и типа. Память под обе матрицы выделена. Для этого я написал такой цикл:

for(N=0;N<size;N++)
{
for(M=0;M<size;M++)
{
for(N2=0;N2<size;N2++)
{
for(M2=0;M2<size;M2++)
{
Matrix[N][M]=Matrix2[N2][M2];
}
}
}
}
наверняка это можно сделать качественнее и быстрее, но с моими знаниями мне это не под силу. Компилируется программа нормально, но когда доходит до этого самого цикла(уже в самом диалоговом окне) вылазит окошко с предложением отправить отчёт об ошибке (ну вы понялиsmile), и причём если жать отладка, видно что, ошибка (насколько я понял), находится в этой строчке:
Matrix[N][M]=Matrix2[N2][M2]; так вот, подскажите пожалуйста как эту ошибку устранить, полный текст программы ниже. Заранее большущее спасибо!


Код

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void main ()
{
        int N;
        int B;
        int M;
        int type;
        int size;
        int osnov;
        int N2;
        int M2;
        double   S=0;
        double   srednee;
        double **Matrix;
        double **Matrix2;
                
        
        
        printf("\n Vvedite razmer kvadratnoi matricy:");
        scanf ("%d", &size);
        
       
        Matrix= new double *[size]; 
        
        for(N=0;N<size;N++)
         {
                 Matrix[N]= new double[size];       /* âûäåëåíèå ïàìÿòè*/
         }



        
        Matrix2= new double *[size]; 
        
        for(N2=0;N2<size;N2++)
         {
                 Matrix[N2]= new double[size];       /* âûäåëåíèå ïàìÿòè ïîä ìàòðèöó2*/
         }

         
         
        printf("\n Tip vvoda  1.Slu4ainyi  2.S klaviaturi  3.Funkciya ");
        scanf("%d",&type);







        switch(type)                                 /*ïåðåêëþ÷àòåëü*/
        { 
case
1:{
    for(N=0;N<size;N++)
    {
        for(M=0;M<size;M++)
        {
            Matrix[N][M]=(rand()%20);
            S+=Matrix[N][M];
        }
    }
    break;
}
case
2:{
    for(N=0;N<size;N++)
    {
        for(M=0;M<size;M++)
        {
            scanf("%lf",&Matrix[N][M]);
            S+=Matrix[N][M];
        }
    }
    break;
}
case 
3:{
    for(N=0;N<size;N++)
    {
        for(M=0;M<size;M++)
        { 
            if (N==M) Matrix[N][M]=0.0;
            else
            Matrix[N][M]=((cos(N+M))/(sin(N-M)));
            

            
            S=0;
             
        }
    }
    break;
        


    }







        printf("\n Pervona4al'nij vid: \n");        /*Ìàòðèöà*/
         for(N=0;N<size;N++)
         {
                 for(M=0;M<size;M++)
                        {    

                                printf("%3.1lf" ,Matrix[N][M]);
                        }
                
                printf("\n");
         }

        srednee= S / (size*size);
        printf("\nSrednee arifmeti4eskoe vsej matrici =  %lf\n",srednee);

        B=size*size;
        printf (" \nKolli4estvo ellementov vashei matricy:");
        printf ("%d", B);
        printf ("\n");                        /*7777777777777777777777777777777777777*/


        
        printf ("Vvedite osnovanie SS:");
        scanf ("%d",&osnov);

        for(N=0;N<size;N++)
        {
            for(M=0;M<size;M++)
            { 
                for(N2=0;N2<size;N2++)
                {
                    for(M2=0;M2<size;M2++)
                    {
                        Matrix[N][M]=Matrix2[N2][M2];
                    }
                }
            }
        }


        for(N2=0;N2<size;N2++)
         {
                 for(M2=0;M2<size;M2++)
                        {    

                                printf("%3.1lf" ,Matrix[N2][M2]);
                        }
        }
                
            
        









         for(N=0;N<size;N++)
          {
             delete []Matrix[N];
         }
         delete []Matrix;
        

        
}


[b][/b][color=blue][/color]
PM MAIL   Вверх
Neitron
Дата 7.11.2005, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



Извини))) Но ты даааааааааааааааааааааллллллллллл=))))))
Код

for(N=0;N<size;N++)
        for(M=0;M<size;M++)
                Matrix[N][M]=Matrix2[N][M];

Вот так делай.

Это сообщение отредактировал(а) Neitron - 7.11.2005, 18:30


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
srd
Дата 7.11.2005, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Строго говоря, ни в Си, ни в Си++ многомерного массива не существует. Его можно эмулировать с помощью массива указателей на массивы (как у тебя в примере), но это неудобно и дорого. Лучше для эмуляции двумерного массива размера X*Y использовать обычный одномерный массив длинной X*Y, где элемент [i][j] определяется как m[i * X + j]. Тогда вместо того, чтобы циклы гонять, можно было обойтись одним memset().


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
OverloaD
Дата 7.11.2005, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.11.2005

Репутация: нет
Всего: нет



вместо того чтоб писать мне какой я дурак, могли бы ответить по вопросу, я же написал что наверняка можно сделать это легче, но я же не знаю к примеру что такое memset() и мне надо сделать эту задачу на уровне МОИХ знаний, поэтому или помогите или не пишите ничего
PM MAIL   Вверх
srd
Дата 7.11.2005, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Сорри, очепятка вышла. Не memset(), а memcpy() smile


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
OverloaD
Дата 7.11.2005, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.11.2005

Репутация: нет
Всего: нет



ну я не знаю и что такое memcpy(), может всё-таки помогёте??? smile
PM MAIL   Вверх
Dark Elf
Дата 7.11.2005, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 26.12.2003
Где: Брисбен

Репутация: 9
Всего: 10



Цитата(OverloaD @ 7.11.2005, 18:02)
ну я не знаю и что такое memcpy(),


memcpy() используется для копирования одного участка памяти в другой. Вот тебе кусок примера из MSDN (оставил то что связано с memcpy())

Код

/* MEMCPY.C: Illustrate overlapping copy: memmove
 * handles it correctly; memcpy does not.
 */

#include <memory.h>
#include <string.h>
#include <stdio.h>

char string1[60] = "The quick brown dog jumps over the lazy fox";
char string2[60] = "The quick brown fox jumps over the lazy dog";
/*                           1         2         3         4         5
 *                  12345678901234567890123456789012345678901234567890
 */

void main( void )
{
   printf( "Function:\tmemcpy without overlap\n" );
   printf( "Source:\t\t%s\n", string1 + 40 );
   printf( "Destination:\t%s\n", string1 + 16 );
   memcpy( string1 + 16, string1 + 40, 3 );
   printf( "Result:\t\t%s\n", string1 );
   printf( "Length:\t\t%d characters\n\n", strlen( string1 ) );
}




--------------------
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
OverloaD
Дата 7.11.2005, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.11.2005

Репутация: нет
Всего: нет



спасибо за помощь, вопрос исчерпан
PM MAIL   Вверх
OverloaD
Дата 7.11.2005, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.11.2005

Репутация: нет
Всего: нет



2Neitron, снк, я сначала не заметил что ты исправленй вариант написал, думал просто написал, что я дурак и всёsmile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0820 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.