2013-07-02 3 views
0

je reçois le "Segmentation fault (core dumped)" erreur avec le code suivant:Segmentation fault (core dumped) l'erreur C de

#include <iostream> 
#include <cstring> 

template <class T> 
T maxn(T* elements, int n); 

template <> const char* maxn <const char*>(const char* elements[], int num); 

int main(){ 
    using namespace std; 

    //Using template 
    int num[6] = {2, 3, 4, 5, 6, 22}; 
    double num2[4] = {16.6, 10.5, 2.3, 1.1}; 

    int larg = maxn(num, 6); 
    double larg2 = maxn(num2, 4); 
    cout << larg << endl << larg2 << endl; 

    //Using specialization 
    const char* pps[5] = {"Hello", "There", "I", "am", "me"}; 
    const char* largest = maxn(pps, 5); 
    cout << largest << endl; 
    return 0; 


}  

//return largest element in an array of T of n elements 
template <class T> 
T maxn(T* elements, int n){ 
    T largest = 0; 
    for (int i=0; i<n; i++) 
     largest = elements[i] > largest ? elements[i] : largest; 
    return largest; 
}  

//Returns address that points to the largest string 
template <> const char* maxn <const char*>(const char* elements[], int num){ 
    int longest = 0; 
    int i =0; 
    for (i=0; i<num; i++) 
     if (strlen(elements[i]) > strlen(elements[longest])) 
      longest = i; 
    return elements[i]; 
} 

Je recevais le « avertissement: conversion dépréciée de constante chaîne CHAR * "erreur mais j'ai changé quelques char * tableaux et arguments de fonction à const char * et je me suis débarrassé de cela. Maintenant, le code de compilation et je reçois la sortie suivante:

16,6

Segmentation fault (core dumped)

Les deux premières lignes sont à droite, mais je ne peut pas comprendre ce qui se passe au troisième. S'il vous plaît, aidez, merci.

+0

Vous économiser beaucoup d'ennuis si vous avez utilisé 'std :: string' au lieu de chaînes de style C. – Lstor

+1

Gardez à l'esprit que votre fonction 'maxn' est déjà écrite pour vous en tant que' std :: max_element'. –

+0

StackOverflow est de nouveau choisi de préférence à gdb. Pourquoi les gens n'apprendront-ils pas à utiliser gdb? – paddy

Répondre

5

Vous élément retour hors limites:

return elements[i]; 

devrait être:

return elements[longest]; 

que je peux suggérer déclarer i en boucle:

for (int i=0; i<num; i++) 
// ^^^^^^^ 

ensuite la ligne return elements[i]; va lancer une compilez l'erreur de temps.

Et, bien sûr, vous devez donner la préférence à des fonctions et des conteneurs intégrés :)

+0

Oui! Je viens de réaliser que Merci! –

+0

@LucasMezaliram Heureux que ça a aidé :) – soon

Questions connexes