2015-12-26 2 views
-2

Ну, я написал код, который в основном делает:найти самую длинную отрицательную последовательность в динамическом массиве

  1. Просит длину массива

  2. входа пользователя массива в * р

  3. Функция longestNeg проверяет самую длинную отрицательную последовательность.

Что он должен делать: Возвращение дольше обратной последовательности с его значениями.

Проблема: в функции longestNeg (бросает исключение)

if (*arr < 0) { 
     counter++; 
    } 

Вопрос: Почему это происходит?

Вопрос2: Будет ли while (arr < arr + n) работать?

Edit3:

#include <conio.h> 
#include <stdio.h> 
#include <stdlib.h> 

void longestNeg(int *arr, int n); 


int main() 
{ 
    int *arr1, n,num = 0,*p; 
    printf("Please enter the size of the array: "); 
    scanf("%d", &n); 
    arr1 = (int*)malloc(n * sizeof(int)); 
    if (arr1 == NULL) 
     printf("Not enough memory\n"); 
    else printf("Array was allocated!\n"); 
    for (p = arr1; p < arr1 + n; p++) 
    { 
     scanf("%d", p); 
    } 
    longestNeg(p - n, n); 

    free(arr1); 
    getch(); 
} 

void longestNeg(int *arr, int n) 
{ 
    int counter = 0, temp = 0, *p; 
    for (p = arr; p < arr + n; p++) 
    { 
     if (*p < 0) { 
      counter++; 
     } 
     else if (counter > temp) { 
       temp = counter; 
       counter = 0; 
     } 
     else 
      counter = 0; 
    } 
    if (counter != 0) 
     for (p = arr; p < arr + counter; p++) 
     { 
      printf("%d ", *p); 
     } 
    else 
     printf("No neg numbers."); 
} 
+1

Что такое «самая длинная отрицательная последовательность»? –

+0

Вы хотите вернуть длину самой длинной отрицательной последовательности, индексы первой и последней или фактической последовательности? – erip

+0

@erip Фактическая последовательность. редактирование –

ответ

1

..... Чтобы подсчитать отрицательные числа, вы увеличиваете arr мимо них, проверяя, являются ли они отрицательными и заканчиваются counter, если это так. Затем вы пытаетесь распечатать counter номера от arr, что теперь указывает после отрицательной последовательностью.

Итак, подумайте об этом. Представьте, что вы компьютер. Человек вошел 1, 2, -1, -2, -3, -4, 3, 4. Вы подсчитываете - и увеличиваете прошлое - 4 отрицательных числа. Ваш указатель arr теперь указывает на предпоследнее значение, 3. Затем пользователь просит вас распечатать counter == 4 значения из этого 3 и далее. Но осталось только 2 значения, принадлежащие выделенной области памяти пользователя, а именно последняя пара, 3 и 4.

При попытке использовать память, которая не принадлежит к ним, пользователь вызывает неопределенное поведение, и программа вполне в пределах своих прав, чтобы сделать абсолютно ничего (неопределенное поведение) - в том числе segfaulting, как это, кажется, на вашей системы.

Итак, прекратите это делать. Используйте либо временную копию переданного указателя arr в своей первой или обеих петлях while, либо выполните подсчет и печать в том же цикле. Это действительно так просто.

Решение проблемы, как если бы вы были компьютером, не следует недооценивать как диагностическую тактику, которая может помочь вам на самом деле задуматься о том, что вы запрограммировали, если вы еще этого не сделали.

+0

Я понимаю ваш ответ. Но как найти адрес начала самой длинной отрицательной последовательности. Я имею в виду, как я могу сохранить адрес «-1», который является третьим значением в вашей заданной последовательности? –

+0

Вам нужно будет сделать _something_ like: дождаться перехода от отрицательного к неотрицательному (вы можете, вероятно, понять это из существующих строительных блоков) сделать какую-то арифметику указателя, чтобы пропустить назад через 'counter' до начала последовательность, которую вы только что подсчитали, и сохраните этот адрес для другого указателя, который будет использоваться позже. Это также может заставлять задуматься о том, как обрабатывать отрицательные последовательности, которые доходят до конца вашего массива, так как нет никакого перехода к обнаружению там - например. специальная проверка в конце. Таким образом, получение адреса должно работать таким же образом. –

+0

Все еще не удалось добиться успеха. Если вы можете помочь с кодом, это было бы оценено. Спасибо за вашу помощь. –

1

Две проблемы: Когда цикл выполняется указатель p указывает на одну за конец выделенной памяти. И вторая проблема - причина вашей проблемы: вы передаете указателю указателю вашей функции, которая ожидает указатель, приводящий к неопределенное поведение.

Вы должны научиться всегда создавать объявления прототипов функций для всех своих функций, потому что тогда компилятор смог бы поймать его и напечатать ошибку вместо того, чтобы просто дать вам предупреждение (которое вы должны были получить).

+2

На самом деле, гораздо больше проблем ... –

+0

Итак, мне нужно сделать: \t p = arr1; \t longestNeg (p, n); –

+0

и объявить функцию. но все равно не работает. –