2010-08-19 13 views
3

Y a-t-il une limite au nombre de fois qu'une boucle peut s'exécuter en C?Limite de boucle en C/C++


void main() 
{ 
    int T,N,x,X,i; 
    x=0; 
    scanf("%d",&T); 
    while(T>0) 
    { 
     T--; 
     scanf("%d",&N); 
     X=0; 
     while(N>0) 
     { 
      N--; 
      scanf("%d",&x); 
      if(x>X){X=x;} 
     } 
     printf("Case: %d",x); 
    } 
} 

T a une plage de 0 à 250 et N a une plage de 0 à 1 000. x a une plage de 0 à 10 000. Chaque fois que le N dépasse quelque chose au dessus de 800, ma console arrête de saisir des données. Cela peut-il être dû à une limite sur le tampon d'entrée?

+0

Je veux dire oui. – XstreamINsanity

+1

Pour référence future: 'int main()', pas 'void main()' – Thanatos

+0

En C ce serait même 'int main (void)'. – Joey

Répondre

4

Il n'y a aucune limite au nombre de boucles d'une boucle. Il y a des limites aux valeurs maximum et minimum d'un int, et celles-ci peuvent jouer dans votre boucle. Dans ce cas, 800 devrait être bien, donc il y a quelque chose d'autre qui se passe ici.

Edit: Works pour moi ... la seule chose bizarre que je vois est que vous réinitialiser X dans la boucle la plus interne, de sorte que la sortie est toujours le dernier entier est entré si elle est> 0 ou 0.

+0

ouais, fait une erreur là-bas. hey pourriez-vous me faire une faveur puisque votre travail. collez le texte entier du fichier ici dans la console - http://terminusbound.com/e.in s'il ne se bloque pas alors faites le moi savoir. – Daal

2

Etes-vous en train de raccorder ce programme? Il peut y avoir une limitation de mise en mémoire tampon avec cela. Essayez de mettre les données dans un fichier et lisez dans le fichier.

+0

Je colle tout d'un coup. Je suppose que vous pouvez appeler cette tuyauterie. – Daal

+1

Essayez d'acheminer le fichier vers votre programme au lieu de le coller. Il peut y avoir une limite à la quantité de données que vous pouvez coller. – tomlogic

+0

@tomlogic - Vous avez sorti les mots de ma bouche. En d'autres termes, 100% sont d'accord. –

1

Parce que les commentaires sont allés irrévérencieux sur toi, je vais faire un wiki communautaire et commencer par une suggestion interrogative comme appartenant dans les commentaires:

Vérifiez les valeurs de retour de tous les appels scanf. Commencez par déterminer si l'API de la bibliothèque standard vous transmet déjà des informations - via "transmission électrostatique", autrement dit le contenu du registre eax après avoir appelé scanf sur l'architecture x86. Ne laissez pas la lumière dans ce registre mourir inaperçue. Prenez les charges électriques du registre (bits) dans une variable et comparez-les à zéro (0) et EOF. Ces transmissions extraterrestres vous ont été envoyées à partir de l'année 1976, lorsque scanf a été écrit pour renvoyer une valeur numérique informative à l'appelant. Comme le signale tomlogic dans les commentaires à une réponse, si vous collez les données, vous devriez plutôt essayer d'utiliser la technique connue sous le nom de "redirection d'entrée" ou "tuyauterie". Tout d'abord, obtenez vos données dans un fichier, disons le nom filename.dat. Ensuite, une commande comme la suivante:

executable-name < filename.dat

Où-nom de l'exécutable est le fichier que vous générez avec le compilateur C. Techniquement, la syntaxe ci-dessus crée une "redirection d'entrée" ou "redirection stdin" - le shell ouvre le fichier pour l'accès en lecture en tant que descripteur de fichier zéro (0), aussi connu comme stdin. Le programme enfant généré par le shell sera scanf à partir du fichier, plutôt que du terminal (votre tampon de collage).

Une autre approche est de créer un « tuyau indirection » dans lequel la coquille ouvre une autre sortie de processus pour la lecture et passe à ce que l'enfant, à nouveau comme descripteur de fichier stdin. Dans ce cas, la coque utilise probablement popen plutôt que open. La syntaxe de cela pourrait être:

cat filename.dat | executable-name comme sur un Unix-clone, ou

type filename.dat | executable-name si dans le contexte d'un clone PC-DOS IBM ® ®.

1

Il est courant d'effectuer une boucle de 10 000 ou (beaucoup) plus pour comparer les performances de deux petits calculs.

S'il y avait une limite, il n'y aurait pas de chose comme une boucle infinie. ;)