2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Инициализация
Сообщение17.12.2013, 17:13 


23/10/13
46
Здравствуйте. Подскажите пожалуйста, почему эта программа не работает? Ругается на то, что 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 


10/04/12
705
А где инициализировано B, оно же A?

 Профиль  
                  
 
 Re: Инициализация
Сообщение17.12.2013, 17:23 


23/10/13
46
mustitz в сообщении #802643 писал(а):
А где инициализировано B, оно же A?


float **B;

-- 17.12.2013, 22:03 --

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

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

 Профиль  
                  
 
 Re: Инициализация
Сообщение17.12.2013, 18:25 


23/10/13
46
Чтобы не создавать новую тему, спрошу тут же. Программа не хочет выводить 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 
Заслуженный участник


12/08/10
1677
Ну на первый взгляд у вас 1ая ошибка в том что А у вас не возвращается. Если я не все забыл, указатель на 2мерный массив это ***A . и вызывается эта фигня как $\&$B


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

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

(Оффтоп)

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

 Профиль  
                  
 
 Re: Инициализация
Сообщение21.02.2014, 03:50 
Аватара пользователя


28/01/12
467
Наверное ТС уже тема не интересует, но я продолжу, так для интереса.

Покромсал программу ТС, чтобы продемонстрировать одну вещь для наглядности.
А именно - нет нужды декларировать матричный указатель 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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group