IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Expression : is_block_type_valid(header->_block_use)


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    Par défaut Expression : is_block_type_valid(header->_block_use)
    Bonjour,

    j'ai implémenté Tesseract sous Windows (Visual C++)

    mais en utilisant ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <tesseract/baseapi.h>
    #include <leptonica/allheaders.h>
     
    void test()
    {
        char *outText;
     
        tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
        // Initialize tesseract-ocr with English, without specifying tessdata path
        if (api->Init(NULL, "eng")) {
            fprintf(stderr, "Could not initialize tesseract.\n");
            exit(1);
        }
     
        // Open input image with leptonica library
        Pix *image = pixRead("/usr/src/tesseract/testing/phototest.tif");
        api->SetImage(image);
        // Get OCR result
        outText = api->GetUTF8Text();
        printf("OCR output:\n%s", outText);
     
        // Destroy used object and release memory
        api->End();
        delete api;
        delete [] outText;
        pixDestroy(&image);
     
        return 0;
    }
    j'ai cette erreur

    Expression: is_block_type_valid(header->_block_use)
    causée par la ligne
    un autre problème
    provoque le crash de l'application

    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Mais pourquoi utilises-tu les operateurs new et delete? On ne doit normalement jamais avoir besoin d'utiliser cela.

    L'erreur est due au delete [] outText, la variable outText n'est jamais initialisée. Supprime toutes les lignes concernant cette variable, ça devrait nettement mieux se dérouler.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    Par défaut
    C'est l'exemple de Tesseract, j'ai juste repris le code d'exemple ici.
    Après je peux commenter les 2 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //delete api;
    //delete [] outText;
    mais je risque d'avoir une fuite mémoire, est-ce que Visual C++ utilise une sorte de Garbage Collector pour vider les pointeurs qui ne sont plus utilisés dans une méthode ?

    la variable "outText" est utilisé dans cet exemple dans printf().

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    En effet, excuse moi, j'ai lu un peu vite.

    Ce qui m'a perturbé est le présence des new et delete qui sont totalement à proscrire en C++, du moins depuis 2011, mais même avant le RAII permettaient des API moins dangereuses.
    Et en regardant par exemple le code de GetUTF8Text(), on voit qu'en interne la chaine est gérée correctement en std::string mais est transformée en un type cracra au moment du return, c'est curieux!

    Du coup, je ne vois pas le pourquoi des erreurs.
    Est-ce bien 2 erreurs à l'exécution?
    Les 2 erreurs correspondraient à "le système de gestion de la mémoire dynamique est paumé", ce qui indique qu'en interne il y a eu une grave erreur de gestion dynamique de la mémoire.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    Par défaut
    le problème se produit à l'éxecution

    j'ai testé également sur GNU/Linux le même code ne pose aucun problème.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Est-ce que la lib utiliserait ses propres allocateurs ou surcharge de new ? Du coup ton delete ne match pas le new utilisé en interne.
    C'est franchement pas trop comme interface qu'ils proposent là...
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    Par défaut
    sur Mac aussi ça fonctionne correctement, je n'ai ce problème que sur Windows.

  8. #8
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    As tu essayé de changer l'ordre de dés-allocation: genre en ordre FILO (Premier entré dernier sortie)?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        delete api;
        delete [] outText;
        pixDestroy(&image);
    Deviendrait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        pixDestroy(&image);
        delete [] outText;
        delete api;
    Autres tests possible:
    As tu le même soucis en Debug et Release?
    Sur Windows as tu essayé ce code avec un autre compilateur. Si oui as tu le même soucis?
    Peut être que sur Windows la lecture de l'image pose un soucis. Peut être que faire un api->SetImage(NULL) avant de libérer api devrait l'aider? (Je n'ai aucune idée du comportement de SetImage :p)

    As tu essayé de tester l'image que pixRead te retourne?
    CHECK(image);

    Hésite pas à farfouiller sur leur git. Ils ont des tests unitaires. Ça t'aidera peut-être:
    https://github.com/tesseract-ocr/tes...arch?q=pixRead
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

  9. #9
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 239
    Points
    2 239
    Par défaut
    Hello, c'est un problème basique de Runtime Windows (a.k.a MT, MTd, MD, MDd ).
    La DLL de Tesseract doit partager le même runtime que ton exécutable. (Si tu fais comme dans l'exemple )
    Avec le peu d'information que j'ai je dirais que Tesseract alloue avec new dans la DLL ( Dans son runtime ) et tu libères dans ton exe qui à son propre runtime.
    Dans ce cas, Windows te dis 'Je ne trouve pas l'allocation dans le tas'.

    Vérifies que ton exécutable à le même runtime que la DLL. Si tu n'as pas moyen de voir quel runtime utilise ta DLL tu as 2 solutions:
    1 - Test avec le runtime MD ( Partage de heap entre les binaires )
    2 - Tesseract doit fournir une fonction pour delete dans la DLL l'allocation qu'il a faite.

    PS: Ca marche sous Linux et Mac, car par défaut les heaps sont partagés. Sous Windows c'est un choix à faire.
    Homer J. Simpson


Discussions similaires

  1. mise en page (Header and Footer) en XML-XSL.
    Par christine dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 01/03/2004, 16h31
  2. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  3. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 16h14
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo