2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Инициализация
Сообщение17.12.2013, 17:13 
Здравствуйте. Подскажите пожалуйста, почему эта программа не работает? Ругается на то, что B не инициализирован, хотя вроде всё есть.
Код:
#include <conio.h>
#include <time.h>
#include <iostream>

void vvod(float **A, int n, int m)
{
   setlocale (LC_CTYPE, "Russian");
    int i, j;

    (float **)malloc(n * sizeof(float *));
   
    for (i = 0; i < n; i++)
        A[i] = (float *)malloc(m * sizeof(float));

   printf("\n Введите значения элементов мат.А (по строкам)\n");
   for (i=0; i<n; i++)   
      for(j=0; j<m; j++)
          scanf ("%f", &A[i][j]);

   for (i=0; i<n; i++)  //вывод значений элементов мат. А по строкам
   {
      printf("\n");
      for(j=0; j<m; j++)
         printf ("%f ", A[i][j]);
   }
   for (i = 0; i < n; i++)
    free(A[i]);
    free(A);
    getch();
    //return 0;
}

void main()

{
   const int imax=10, jmax=10;
   setlocale(LC_CTYPE, "Russian");
   int i,j,z,p; float **B;

   printf("Input size z: ");
    scanf("%d", &z);
    printf("Input size p: ");
    scanf("%d", &p);

   vvod(B,z,p);
   
   _getch();
}

 
 
 
 Re: Инициализация
Сообщение17.12.2013, 17:22 
А где инициализировано B, оно же A?

 
 
 
 Re: Инициализация
Сообщение17.12.2013, 17:23 
mustitz в сообщении #802643 писал(а):
А где инициализировано B, оно же A?


float **B;

-- 17.12.2013, 22:03 --

А, всё, я дурачок немного. Вписал эту строчку и всё вроде заработало

Код:
B = (float **)malloc(z * sizeof(float *));

 
 
 
 Re: Инициализация
Сообщение17.12.2013, 18:25 
Чтобы не создавать новую тему, спрошу тут же. Программа не хочет выводить index. Почему? Может что-то не так с возвратом значения в подпрограмме?

Код:
#include <conio.h>
#include <time.h>
#include <iostream>

float vvod(float **A, int n, int m)
{
   setlocale (LC_CTYPE, "Russian");
    int i, j;

    A = (float **)malloc(n * sizeof(float *));
   
    for (i = 0; i < n; i++)
        A[i] = (float *)malloc(m * sizeof(float));

   printf("\n Введите значения элементов мат.А (по строкам)\n");
   for (i=0; i<n; i++)   
      for(j=0; j<m; j++)
          scanf ("%f", &A[i][j]);

   for (i=0; i<n; i++)  //вывод значений элементов мат. А по строкам
   {
      printf("\n");
      for(j=0; j<m; j++)
         printf ("%f ", A[i][j]);
   }
   for (i = 0; i < n; i++)
    free(A[i]);
    free(A);
    getch();
    return 0;
}

int rasst(float **A,int m, int t)
{
   float sumpr, max_sumpr=0;
   int index=1;
   for (int k=1; k<m; k++)
    {
        sumpr = 0;

        for (int j=0; j<t; j++)
            sumpr += A[0][j] * A[k][j]; //нахождение суммы произведений (расстояния)

        if (sumpr > max_sumpr)
        {
            max_sumpr = sumpr; //максимальное расстояние
            index = k;
        }
   }
   printf("\n Номер строки=%d", index+1);
      getch();
      return index;
}

void main()

{
   setlocale(LC_CTYPE, "Russian");
   int i,j,z,p; float **B;
   
   printf("Input size z: ");
    scanf("%d", &z);
    printf("Input size p: ");
    scanf("%d", &p);
   B = (float **)malloc(z * sizeof(float *));
   vvod(B,z,p);
   rasst(B,z,p);
   _getch();
}

 
 
 
 Re: Инициализация
Сообщение23.12.2013, 07:37 
Ну на первый взгляд у вас 1ая ошибка в том что А у вас не возвращается. Если я не все забыл, указатель на 2мерный массив это ***A . и вызывается эта фигня как $\&$B


-- Пн дек 23, 2013 08:45:23 --

Да и еще. При выделении памяти для А Вы теряете переданное в функцию значение массива.

(Оффтоп)

как &(shift+7 на английском) написать печатный?

 
 
 
 Re: Инициализация
Сообщение21.02.2014, 03:50 
Аватара пользователя
Наверное ТС уже тема не интересует, но я продолжу, так для интереса.

Покромсал программу ТС, чтобы продемонстрировать одну вещь для наглядности.
А именно - нет нужды декларировать матричный указатель float **,
достаточно обыкновенный указатель float *, причем до рабочих функций передовать его как float * const.

Ну и вот на суд присяжных представляю:
Код:
#include <locale.h>
#include <stdio.h>
#include <malloc.h>

void vvod( float * const A, int n, int m )
{
   float* tmpA = A;
   int i, j, result;

   printf("\n Vvedi dannye do matricy [%dx%d] \n", n,m);
   for (i=0; i<n; i++)
   {
      for(j=0; j<m; j++)
      {
         result = scanf ("%f", tmpA++);
         if( result !=1 ) break;
      }
   }
   
   tmpA = A; // обязательно переставить рабочий указатель на начало
   
    for (i=0; i<n; i++) 
    {
        printf("\n");
        for(j=0; j<m; j++)
           printf ("%f ", *tmpA++);
    }

    getch();
}

int rasst( float * const A, int m, int t)
{
   float* tmpA = A;
   float sumpr, max_sumpr=0;
   int index=1, k, j;

   for(k=0; k<m; k++)
   {
       sumpr = 0;
       for(j=0; j<t; j++)
           sumpr += *tmpA++;
   
       if (sumpr > max_sumpr)
       {
           max_sumpr = sumpr;
           index = k;
       }
   }
   printf("\nMaxSumStroki=%f,  Numer stroki=%d", max_sumpr, index+1);
   return index;
}

void main()
{
   setlocale( LC_ALL, "" );
   int i,j,z,p; float *B;
   
   printf("Input size z: ");
   scanf("%d", &z);
   printf("Input size p: ");
   scanf("%d", &p);
   
   //выделяем память для матрицы
   B = (float *)malloc( z*p*sizeof(float *));
   
   vvod( B,z,p );
   rasst( B,z,p );
   
   getch();
   free(B); //освобождаем выделенную память
}

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group