Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Помогите с массивами


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

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]

Автор: Neitron 7.11.2005, 16:52
Извини))) Но ты даааааааааааааааааааааллллллллллл=))))))
Код

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

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

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

Автор: OverloaD 7.11.2005, 17:52
вместо того чтоб писать мне какой я дурак, могли бы ответить по вопросу, я же написал что наверняка можно сделать это легче, но я же не знаю к примеру что такое memset() и мне надо сделать эту задачу на уровне МОИХ знаний, поэтому или помогите или не пишите ничего

Автор: srd 7.11.2005, 17:59
Сорри, очепятка вышла. Не memset(), а memcpy() smile

Автор: OverloaD 7.11.2005, 18:02
ну я не знаю и что такое memcpy(), может всё-таки помогёте??? smile

Автор: Dark Elf 7.11.2005, 18:18
Цитата(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 ) );
}


Автор: OverloaD 7.11.2005, 18:27
спасибо за помощь, вопрос исчерпан

Автор: OverloaD 7.11.2005, 18:48
2Neitron, снк, я сначала не заметил что ты исправленй вариант написал, думал просто написал, что я дурак и всёsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)