C言語なら俺に聞け( ..
481:デフォルトの名無しさん
07/11/19 19:45:40
>>480
構造体を先頭から辿るときに、いま何個目かわかるように、その辿った回数を数えとけばいい
482:デフォルトの名無しさん
07/11/19 19:48:20
結局ソレが一番無難ですかー。
習ってたものでは一つ一つに入力の際でも、内部処理としての変数でもカウントアップさせるようなものを用意して、
その番号に直。
か、または、たどる時に何個かこっちが指定するって感じですか・・・。
難しそうだ('A`
483:デフォルトの名無しさん
07/11/19 20:10:58
つまり、何番目にアクセスしたいという要求が頻繁にあるときには、
そういう線形リストは向いていない。配列が向いている。
484:デフォルトの名無しさん
07/11/19 20:11:35
>>480
自己参照構造体というか、線形リストのことでしょ。
485:デフォルトの名無しさん
07/11/19 20:49:54
なるほど・・・勉強になります。
486:デフォルトの名無しさん
07/11/19 23:50:37
>>479
狭い世間なんだね。
487:デフォルトの名無しさん
07/11/19 23:55:07
なんか妄想してる奴がいるな
488:デフォルトの名無しさん
07/11/19 23:56:02
構造体のメンバのアドレスって構造体の先頭のアドレスから
求められるものなの?
489:デフォルトの名無しさん
07/11/19 23:56:54
>>478
途中宣言のほうが格段に読みやすい。
490:デフォルトの名無しさん
07/11/20 00:00:33
関数の長さによるだろ。
491:デフォルトの名無しさん
07/11/20 00:03:41
関数の長さによらず、途中宣言のほうが読みやすい。
492:デフォルトの名無しさん
07/11/20 00:10:17
こんばんは
大学の課題のことで質問です。
文字列をクイックソートで並ぶかえるプログラムなのですが、エラーが出来ます。
void your_sort(char *s[NS][WC]) {
int pivot;
int l_hold,r_hold;
int x=0;
int left = 0;
int right = WC-1;
l_hold = left;
r_hold = right;
pivot = (left+right)/2;
while(x<WC){
while(left < right)
{
while(strcmp(&s[x][right],&s[x][pivot])>0)
right--;
if(left =right)
{
s[x][left] = s[x][right];
left++;
}
493:デフォルトの名無しさん
07/11/20 00:12:09
>>492
コンパイラの警告は無視しないできちんと対処しましょう。
もしそのコードで警告が出ないようなら、コンパイラのオプションを見直しましょう。
もし警告レベルを換えても警告が出ないようなら、そんなコンパイラは投げ捨てましょう。
494:デフォルトの名無しさん
07/11/20 00:12:23
while((strcmp( &s[x][pivot],&s[x][left])<0) &&(left <right))
right--;
if(left != right)
{
s[x][left] = s[x][right];
left++;
}
while((strcmp( &s[x][pivot], &s[x][left])>0)&&(left < right))
left++;
if(left != right)
{
s[x][right] = s[x][left];
right--;
}
left = l_hold;
right = r_hold;
if(left < pivot)
your_sort(s[x][pivot-1]);
if(right > pivot)
your_sort(s[x]pivot+1,right);
}
x++;
}
エラー:cpp(39) : error C2664: 'strcmp' : 1 番目の引数を 'char **__w64 ' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
どこがおかしいのか教えて下さい
495:宿題スレへ逝け
07/11/20 00:16:14
>どこがおかしいのか教えて下さい
あんたの頭。
496:デフォルトの名無しさん
07/11/20 00:26:48
>>474
今更っぽいけど、ちょい補足。
-ansiはc89相当だけど、gcc拡張機能として途中の宣言が出来るので何も言われない。
厳密にc89を適応したければ-pedanticか-pedantic-errorsを-ansiと一緒に指定する。
でもコレやると//でのコメントとかですら怒られるけどな。
497:デフォルトの名無しさん
07/11/20 00:32:57
>>495
いつもならこういう煽りは見ていて腹立たしくなるが今回は同意してしまった。
498:デフォルトの名無しさん
07/11/20 08:15:27
>>494
>どこがおかしいのか教えて下さい
strcmp の 1 番目の引数がおかしいって書いてあるじゃん
499:デフォルトの名無しさん
07/11/20 15:25:31
bool 型同士の比較演算の結果はどうなるのでしょうか?
true / false それぞれが何らかの整数に変換されてから
比較されるのでしょうか?
500:デフォルトの名無しさん
07/11/20 16:09:59
>>499
trueは非0、falseは0としてコンパイラが評価する。
501:デフォルトの名無しさん
07/11/20 16:14:20
>>499
C言語にbool型なんて無い。
502:デフォルトの名無しさん
07/11/20 16:40:31
>>501
c99はcではないとでも?
503:デフォルトの名無しさん
07/11/20 16:50:14
それ_Boolのtypedef。
1と0を保持する整数型で、比較演算では結局int型に格上げされるはず。
504:デフォルトの名無しさん
07/11/20 17:25:48
文字列0.051/0.056/0.095/0.010 msから
2番目の要素、上の文字列だと0.056を文字列検索かけてうまくとる方法教えてください
505:デフォルトの名無しさん
07/11/20 17:28:52
>>504
これでいいのかな?
#include <stdio.h>
int main(void){
char str[]="文字列0.051/0.056/0.095/0.010 msから";
char second_value[100];
sscanf(str, "%*[^/]/%[^/]", second_value);
puts(second_value);
return 0;
}
506:デフォルトの名無しさん
07/11/20 17:41:44
>>505
ありがとう、うまくいきました。
私が書いた正規表現が間違ってたみたいです。
507:476
07/11/20 21:55:54
>>479
遅れましたが、情報サンクスです。
VisualC++が対応していないというのは驚きですね。C++とみなしてコンパイルすればいいんだろうけど。
>>496
細かい情報ありがとう。-ansiで厳密なANSI準拠にならないというのはなんか間違ってる気がする。UIとして。
508:デフォルトの名無しさん
07/11/21 01:12:45
>厳密なANSI準拠
ここに矛盾を感じない人には丁度いいのでは?
509:デフォルトの名無しさん
07/11/21 10:18:11
もうテンプレに、このスレはC89用って書いとけよ
510:デフォルトの名無しさん
07/11/21 10:26:43
C90 じゃなくて?
511:デフォルトの名無しさん
07/11/21 10:30:37
うん
512:デフォルトの名無しさん
07/11/21 10:38:37
1年は365日ですけど、それを1月は31日、2月は28日、3月は31日・・・・12月は31日っいう感じに書き換えるプログラムを作りたいんですがどうすればいいでしょうか?
513:デフォルトの名無しさん
07/11/21 10:42:06
お前にはまだ早い
514:デフォルトの名無しさん
07/11/21 10:44:07
>>512
書き換えるの意味がわからん。
122日 -> 5月2日
という感じ?
515:デフォルトの名無しさん
07/11/21 10:45:02
>>514
そうです。
516:デフォルトの名無しさん
07/11/21 10:47:46
年はどうするの?
うるう年を考慮するのか、とか
517:デフォルトの名無しさん
07/11/21 10:50:25
今年の月日です。
518:デフォルトの名無しさん
07/11/21 10:59:47
>>517
自分で月数の配列作って計算してもいいけど、
標準関数使うなら、mktime で 2007年1月122日を設定(122はtm_mdayに入れる))すれば
tm_mon に0から始まる月、tm_mdayに1から始まる日が入るはず。
519:デフォルトの名無しさん
07/11/21 11:20:43
>>518
ありがとうございます!
…が、初心者の俺には難しいようでした。まったくわかりません。
お手数おかけしてすみませんでした。
520:デフォルトの名無しさん
07/11/21 11:27:40
void calendar(int day){
if(day > 0 && day <= 365){
int data[] = {31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;i<12;i++){
if((day-=data[i])<= 0){
printf("%d月%d日\n",i+1,day+data[i]);
return;
}
}
}
else
printf("1〜365の間で入力してください。\n");
}
521:デフォルトの名無しさん
07/11/21 11:32:06
>>519
struct tm tm = {0};
tm.tm_year = 2007 - 1900;
tm.tm_mday = 122;
time_t t = mktime(&tm);
printf("%d月%d日", tm_mon + 1, tm.tm_mday);
522:デフォルトの名無しさん
07/11/21 12:38:46
#include <stdio.h>
int main(void)
{ char str[256];
char s[] = "This is a pen. That is an apple.";
int i,j,k,checker;
printf("This is a pen. That is an apple.\n\n");
gets(str);
for(j=0;j<256;j++)
{for(i=j,k=0;str[k]!='\0';k++,i++)
{if(str[k]==s[i])
{checker=1;
break;}
else
{checker=0;}}}
if(checker==1)
{printf("OK!その文字列は含まれています。。\n");}
else
{
printf("NG!その文字列は含まれていません。\n");}}
初期化した文字列(This is~)と, キーボードから入力した文字列 str に対し, 文字列中に str が出現するかどうかを判定して表示するプログラムを作成したいのですが、
なかなかうまくいきません。最初のifelse文においてのreturnが変だと思うのですが。
例えば This→OK That→OK is→OK apple→OK pple→OK…
523:デフォルトの名無しさん
07/11/21 12:43:41
>>522
#include <string.h>
char *strstr(const char *s1, const char *s2);
URLリンク(www9.plala.or.jp)
これじゃ駄目なの?
524:デフォルトの名無しさん
07/11/21 12:45:39
>>523
申し訳ないです。
stiring.hを使わず、for文でループして検索するっていう条件付です;
525:デフォルトの名無しさん
07/11/21 12:51:49
>>522
この前同じようなの見かけた
スレリンク(tech板:389-番)
526:デフォルトの名無しさん
07/11/21 12:54:12
>>522
×s[] について検索開始位置 (j=0 ; j<256; j++)とあるが、s[j] != '\0'でで辞めるべき
×1文字でも一致していると、処理を抜けてしまう
→1文字でも不一致で処理を抜けるべき
527:526
07/11/21 13:01:08
あと、2段目のforループで一致判定出たら、1段目のforループ抜けるのも
忘れずに
528:デフォルトの名無しさん
07/11/21 13:04:16
>>526
ってことは根本的には間違ってるんですかね?
数文でもいいので例をあげてもらえればうれしいです。
529:デフォルトの名無しさん
07/11/21 13:07:14
>>527
あっ、なるほど!
サンクスです。
530:デフォルトの名無しさん
07/11/21 13:08:29
>>522
なるべく原型を留めたつもり。
char *sp,*strp,*bsp;
for(sp = s; *sp!='\0';sp++){
for(strp = str, bsp=sp; *strp!='\0' && bsp != '\0';strp++,bsp++){
if(*strp == *bsp)
checker = 1;
else{
checker = 0;
break;
}
}
if(checker)
break;
}
531:デフォルトの名無しさん
07/11/21 13:12:26
やばいw
少しわかったつもりですが、forで混乱してるかも…
>>527のヒントがすごいわかり易いんですけど、こっからつまってます。
532:デフォルトの名無しさん
07/11/21 13:21:12
つーかchekerは0で初期化しといて、elseで代入はやめなよ
533:デフォルトの名無しさん
07/11/21 13:25:37
>>532なるほど
教えてくんでごめんなさい
534:デフォルトの名無しさん
07/11/21 15:07:20
整数型の数字を一文字ごとに分割したいので
sprintf(b,"%x",a);
としたのですが
printf("%s",b[0]);
としてみたところセグメントエラーが出てしまいます
どうしてでしょうか?
aはint型変数です
535:デフォルトの名無しさん
07/11/21 15:11:50
bの型は?
あと%xは16進数、%sは文字列だがいいのか?
b[0]がchar型なら、%cだろ?
536:デフォルトの名無しさん
07/11/21 15:12:17
bがchar*として考えると,printf("%s",b[0]);はprintf("%c",b[0]);
537:デフォルトの名無しさん
07/11/21 15:29:47
>>535>>536
sとcは違うんですねw
ありがとうございました
538:デフォルトの名無しさん
07/11/21 16:36:35
同じだと思ってたのか
539:デフォルトの名無しさん
07/11/21 16:56:03
>>536
ウソツケ
printf("%s",b[0])
はb[0]の値をアドレスとする番地から始まるゼロ終端文字列を表示し
printf("%c",b[0])
はb[0]の値を文字コードとする文字を表示する
540:デフォルトの名無しさん
07/11/21 17:07:12
質問から読んで書いてるのだろうか。
541:デフォルトの名無しさん
07/11/21 17:08:37
>>539
後者に直せって意味で書いた
542:デフォルトの名無しさん
07/11/21 17:13:21
何コイツ
543:539
07/11/21 17:40:45
>>541
スマン
イコールの意味だと勘違いしてた
544:デフォルトの名無しさん
07/11/21 17:53:09
m9(^Д
545:デフォルトの名無しさん
07/11/21 18:49:06
borlandからVisualStudio2005に変えたんですが、
VSだとexeファイルってできないんですかね
546:デフォルトの名無しさん
07/11/21 18:51:05
なぜそう思った?
547:デフォルトの名無しさん
07/11/21 19:24:48
debug フォルダの中にできてるよ。
548:デフォルトの名無しさん
07/11/21 21:23:29
初心者です。
return 0
がどういう意味なのかがどうしても分かりません。
return 0
があると、コンピュータは何をするのでしょうか?
549:デフォルトの名無しさん
07/11/21 21:28:57
まずmain内に記述してると思うけど、main関数(mainという小さなプログラム)があるんだ。
int main(void)って書いてるでしょ?
return 0;ってのは、OSに 正常終了しましたよ〜って知らせるための記述。
でなぜ0なのかってのはint main(void)ってコトからわかるように、
main関数には整数を返しますよってコトです。
まぁ余談になったけど、 正常終了 ってコトです。
550:デフォルトの名無しさん
07/11/21 21:31:20
>main関数には整数を返しますよってコトです。
「には」じゃなくて「は」だろ。
551:デフォルトの名無しさん
07/11/21 21:32:29
んじゃreturn 1だとしたらどうなるんです?
552:デフォルトの名無しさん
07/11/21 21:35:19
光あれと1と戻すだけ。
受け取る者がいなければ、
次のクロックで虚無に消える。
553:デフォルトの名無しさん
07/11/21 21:35:20
return 1って異常終了じゃないっけか?
exit(1)と同じだと認識してる・・・
554:デフォルトの名無しさん
07/11/21 21:39:37
受け取る側で判断するから異常とは限らないな
555:デフォルトの名無しさん
07/11/21 22:01:01
>>549
そうです。それがよく分からないんです。
正常終了したかどうかはコンピュータが判断することでは?
「これは正常終了したことにします」って人間が決めちゃうんですか?
「正常終了」の意味が分かってないんだと思います。
main()関数は引数として0か1を渡してあげないといけないということでしょうか?
1を渡した場合、どうなるのでしょうか?
556:デフォルトの名無しさん
07/11/21 22:03:03
2とか3とかも渡せるぞ
557:デフォルトの名無しさん
07/11/21 22:09:00
>>555
OSが何なのか分かってないのでは?
558:デフォルトの名無しさん
07/11/21 22:13:03
>>555
別にプログラムから1が返ってきたからってコンピュータはどうもしないけど、
シェルスクリプトやバッチファイルでコマンドの終了状態で処理を分岐したりだとか、
make中にコンパイルが失敗した時に処理を中断したりだとか、
そういう場面で使う。
俺的には「1つのプログラムで処理が完結する場合ばっかりじゃないので、
一応お約束が決まってます」ってぐらいだと思ってるけど。
559:デフォルトの名無しさん
07/11/21 22:14:25
>>555
コンピュータがどうやって「正常終了」の判断をするのかkwsk
560:555
07/11/21 22:19:56
スマン適当に言っただけだ。流してくれ。
561:デフォルトの名無しさん
07/11/21 22:21:03
>>555
main関数からどんな値を返そうと、WindowsやUnixなど大抵のOSは何も行わない。
ただ、その値を「欲しがっているところ」に引き渡すだけ。
「欲しがっているところ」とは、単に別のプログラム、大抵はバッチファイルやシェルスクリプト。
0が正常終了というのは、シェルスクリプトらとプログラムとの間の暗黙の了解。
当時の資料を探せば何か根拠が出てくるかもしれない。
Cはそれを標準規格へ取り込んだ。
562:デフォルトの名無しさん
07/11/21 22:32:10
正しいか正しくないかは人間がきめること。
CPUはただクロックを数えるのみ。
563:デフォルトの名無しさん
07/11/21 22:40:55
自己参照構造体のポインタの動きで頭がこんがらがりまくる・・・
繋ぎなおして先頭アドレスをmainに返すってのはわかるんだけど、
か、書けねえ・・・
なんかコツとかありますか('A`)
564:デフォルトの名無しさん
07/11/21 22:44:19
>>557-558、>>561
ありがとうございます。
どうやら
return 0;
が何かを理解するのに必要な知識がだいぶ不足しているようです。
OSが何なのかや「make中」などが分かりません。
あてどもなくググってみたところ、
URLリンク(www.mech.utsunomiya-u.ac.jp)
の下の方の記述を見つけ、ようやっと、「一応お約束」や「暗黙の了解」
という意味が分かりました。
ただ、
return 0;
を書いた段階でプログラムが終わってしまうのは知りませんでしたが、
引数を返した時点で関数というのはそれ以上見なくなってしまうものなんですね。
もう少し勉強が必要です。少し知識を身につけてから、また皆さんの書き込み
を見たら意味が理解できるのかもしれません。ありがとうございました。
565:デフォルトの名無しさん
07/11/21 22:44:37
紙に書いて考えれば?
566:デフォルトの名無しさん
07/11/21 22:45:22
>>563
構造体を四角、ポインタの指す方向を線で、紙に書いてやってみそ。
慣れたら、頭の中でできるようになる。
567:デフォルトの名無しさん
07/11/21 22:52:16
URLリンク(www.mech.utsunomiya-u.ac.jp)
の下の方のところ、貼っておきます。
------------------------------------
return 0 とは,プログラムの正常終了を意味している.とはいえ,これは UNIX 上でないとほとんど意味をなさないかもしれない.
UNIXでは,シェル(shell)と呼ばれるインタフェースプログラムを介してプログラムの実行が行われる. return 0 はこのシェルに
よってプログラムの終了状態に合わせた処理を行わせることができる.たとえば,Bash(Linux の標準シェル)の場合,
if program; then echo "OK"; else echo "ERROR"; fi
と記述することによって, program という名前のプログラムを実行し,もしそのプログラムが正常に終了した場合は OK を表示し,
正常に終了しなかった場合には ERROR を表示するようにすることができる. 正常に終了しなかった場合を表すには,たとえば次のよう記述する.
#include <stdio.h>
int main()
{
int a, b, c;
if (c != 0) {
a = b / 0;
} else {
printf("c = 0 なので割れません\n");
exit(1); /* 異常終了として1を返してプログラムを終了する */
}
return 0;
}
このプログラムでは, 0で割算を行わないように,まず変数 c がゼロでないかチェックし,もし変数 c がゼロのときには異常を
示してプログラムを終了する. exit() はプログラムを終了させるための関数で,引数の値が返される.一般的には,正常に終了
した場合には 0 を返すことにし,正常に終了しなかった場合には他の値を返すことになっている.だから,return 0 は
プログラムの正常終了を示すために必要なのである.また,main() の前の int は 0 や 異常終了の値の型を表している.
568:デフォルトの名無しさん
07/11/21 23:11:09
おそらく>>297は皆を困らせようとして書いただけだよ
569:デフォルトの名無しさん
07/11/21 23:50:47
xor eax, eax
ret
570:デフォルトの名無しさん
07/11/21 23:59:44
>>564
process.h のsystem関数で外部exeを実行できるんだけど、
system関数の戻り値がintでそのプログラムが返した値を返す。
最後にreturn 0;だったら0。return 10;だったら10。
void main()だと不定っぽい。
571:デフォルトの名無しさん
07/11/22 00:04:12
//child.c
#include <stdio.h>
int main(){
printf("hogeeeeeeee!!\n");
return 10;
}
//parent.c
#include <stdio.h>
#include <process.h>
int main(){
printf("system::%d", system("child"));
return 0;
}
二つをコンパイルしてparentを実行した結果
>hogeeeeeeee!!
>system::10
と出るはず。
572:デフォルトの名無しさん
07/11/22 01:13:16
プログラムの正常終了は0だが、各関数の正常終了も0を返すようにしてる?
if文やwhile文が0以外を真としたりするので、0を返しちゃうと判定で偽になるよね?
みんなは省略形は使わずに、必ず==で何かと比較してますか?
573:デフォルトの名無しさん
07/11/22 01:16:40
俺はmain以外の関数の場合、<ctype.h>のisナントカに合わせて0以外を真と見做すことにしている。
ほかの言語 (C++, Java, C#)でもtrueは1で、falseは0に相当するし。
574:デフォルトの名無しさん
07/11/22 02:05:04
自分はファイル分割をする際、main.hなどと命名したヘッダファイル
にプロジェクトで使う全ての関数をプロトタイプ宣言しています。
例えば、
<<main.hの中身>>
#include "proj1.h"
extern void test1(void);
extern int test2(int);
: // 以下色々な宣言等を列挙
といった具合です。
今までプロトタイプ宣言している関数の頭にはとりあえずexternを
書く必要があるのだろうと思っていました。
しかし、このexternを書かなくても正常にビルド出来てしまいます。
環境がVisualStudioだからでしょうか?
このextern宣言は邪魔くさいのでこれからは外して記述しようと思う
のですが、externが無い場合困るケースとしてどのような事が考えられますか?
575:デフォルトの名無しさん
07/11/22 02:50:24
ヤメレ
576:デフォルトの名無しさん
07/11/22 04:51:07
関数の宣言は暗黙にexternだから別に構わないけど、
変数は定義になるから、extern必須。
普通は両方つけて揃えるはず。
577:デフォルトの名無しさん
07/11/22 05:19:54
関数にexternをつけてるソースは、殆ど見た事が無いなぁ。
578:デフォルトの名無しさん
07/11/22 07:20:44
>574
直接関係無いけど、なんでもかんでもグローバル関数にしないこと。
579:デフォルトの名無しさん
07/11/22 11:05:55
static でプロトタイプ宣言するのと区別するのに、
外部参照なんだから extern つければ?
580:デフォルトの名無しさん
07/11/22 11:53:53
ビットマップの画像を平行移動させるプログラムを作っているのですが、
出力が真っ黒になってしまい、うまく動作しません。
単純なバグだと思うのですが、教えていただけると大変助かります。よろしくお願いします。
/* 画像の平行移動 */
void image_shift( unsigned char out2[Y_SIZE][X_SIZE][3],
unsigned char out[Y_SIZE][X_SIZE][3] )
{
unsigned int i,j,sx,sy,x,y;
sx=148; // X方向のシフト量
sy=128; // Y方向のシフト量
for(i=0;i<biHeight;i++){
for(j=0;j<biWidth;j++){
y=i+sy;
x=j+sx;
out2[y][x][0]=out[i][j][0];
out2[y][x][1]=out[i][j][1];
out2[y][x][2]=out[i][j][2];
}
}
}
581:デフォルトの名無しさん
07/11/22 13:43:27
OPENGLを使えばいいと思うよ><
あとBMPがちゃんと確保されてるか確認した?
582:デフォルトの名無しさん
07/11/22 13:50:06
回答ありがとうございます!
BMPはちゃんと確保されてます。そのまま出力もできますし・・・
OpenGLも考えてみます。
583:デフォルトの名無しさん
07/11/22 13:51:19
>>580
取り敢えずシフト量を0にして試してみたら?
584:デフォルトの名無しさん
07/11/22 14:04:32
シフト量を0
そのあと1とか小さい値にして
デバッグモードで確認して
585:デフォルトの名無しさん
07/11/22 14:07:41
シフトした分だけあふれてるような気がするんだけど。
586:デフォルトの名無しさん
07/11/22 14:11:17
みなさんのおっしゃるとおりです。
シフト量を0にすると、ちゃんと元の画像が出るんです。
ずらすと真っ黒になったりするんです。マイナス方向にずらすとエラーで止まってしまいますし・・・。
587:デフォルトの名無しさん
07/11/22 14:15:36
>>マイナス方向にずらすとエラーで止まってしまいますし・・・。
それout2の領域外に書き込んでないか?
つまり配列の添え字がマイナスになったりX_SIZEやY_SIZEをオーバーしたり…
588:デフォルトの名無しさん
07/11/22 14:19:34
for(i=0; i<biHeight; i++) {
for(j=0; j<biWidth; j++) {
y = (i+sy) % biHeight;
x = (i+sx) % biWidth;
ってしてみれば?
589:デフォルトの名無しさん
07/11/22 14:19:53
ありがとうございます!
やっと解決しました。
大きな理由はビットマップのビット深さを間違えてました。
どうもお手数おかけしてすいません。ありがとうございました!
590:デフォルトの名無しさん
07/11/22 14:38:34
アチャー
591:デフォルトの名無しさん
07/11/22 14:47:41
なんかC言語の配列って何度も呼び出すと鈍くならない?
なんで
a = x[y[z[n]]];
みたいな感じ
a=z[n];a=y[a];a=x[a];
のほうが速くない?
592:デフォルトの名無しさん
07/11/22 14:56:24
計ってみれば?
593:デフォルトの名無しさん
07/11/22 15:05:40
計ってみたよ 配列に何度も入れた方がわずかに速いようだ
#include <iostream>
#include <time.h>
#define N 900000
using namespace std;
main(){
unsigned int n,k,c,sum;
unsigned int *x,*y,*z,*v,*w;
x=new unsigned int [N]; y=new unsigned int [N];
z=new unsigned int [N]; v=new unsigned int [N];
w=new unsigned int [N];
for(n=0;n<N;n++){x[n]=rand()%10;y[n]=rand()%N;z[n]=rand()%N;v[n]=rand()%N;w[n]=rand()%N;}
sum=0; c=clock();
for(n=0;n<N;n++){k=w[n];k=v[k];k=z[k];k=y[k];sum+=x[k];}
c=clock()-c; cout<<c<<" clock "<<sum<<endl;
sum=0; c=clock();
for(n=0;n<N;n++)sum+=x[y[z[v[w[n]]]]];
c=clock()-c; cout<<c<<" clock "<<sum<<endl;
}
594:デフォルトの名無しさん
07/11/22 15:30:37
>>593
手元のiccでは全く同じコードにコンパイルされたよ。
--
movl (%rbx,%rcx,4), %ecx #15.20
movl (%rbp,%rcx,4), %edi #15.27
movl (%r12,%rdi,4), %r8d #15.34
movl (%r13,%r8,4), %r9d #15.41
addl $1, %edx #15.13
movl %edx, %ecx #15.13
addl (%r10,%r9,4), %r15d #15.46
movl %ecx, %edx #15.1
cmpl $900000, %edx #15.1
jb ..B1.15 # Prob 99% #15.1
--
movl (%rbx,%rcx,4), %ecx #19.30
movl (%rbp,%rcx,4), %esi #19.28
movl (%r12,%rsi,4), %edi #19.26
movl (%r13,%rdi,4), %r8d #19.24
addl $1, %edx #19.13
movl %edx, %ecx #19.13
addl (%r9,%r8,4), %r15d #19.17
movl %ecx, %edx #19.1
cmpl $900000, %edx #19.1
jb ..B1.23 # Prob 99% #19.1
--
595:デフォルトの名無しさん
07/11/22 15:31:30
処で、>593はなんでC++でコンパイルしているんだ?
596:デフォルトの名無しさん
07/11/22 15:34:55
仮想関数を利用する上での注意点があれば教えて下さい。
597:デフォルトの名無しさん
07/11/22 15:40:00
iccだとmovlにしてくれるのか
VCだとmov,mov,...ってのにしかならない
598:デフォルトの名無しさん
07/11/22 15:44:40
>593以下速度の話題
C/C++スレか速度スレ、或いは最適化スレへどうぞ。
>>596
あんたもスレ違い。
599:デフォルトの名無しさん
07/11/22 21:02:53
for(i=10;i>=0;i--)printf("%d\n"i);
っていうコード unsigned にするとやばいね 全然気づかなかったよ
600:デフォルトの名無しさん
07/11/22 21:11:23
処理系依存になるってこと?
601:デフォルトの名無しさん
07/11/22 21:17:31
unsigned int iに対してi>=0は常に真だべ
602:デフォルトの名無しさん
07/11/22 21:20:46
なるほど
どうもありがとう
603:デフォルトの名無しさん
07/11/22 22:37:22
ポインタが指してる内容を配列に入れたいのですがどうしたらいいですか?
例えば、
char *a="ABC";
char b[4];
このとき、 b[0]=A,b[1]=B,b[2]=C にしたいです。
604:デフォルトの名無しさん
07/11/22 22:39:15
strcpy(b,a);
605:デフォルトの名無しさん
07/11/22 22:41:18
memmove(b,a,3);
606:603
07/11/22 23:01:19
>>604,>>605
できました。
ありがとうございます。
607:デフォルトの名無しさん
07/11/22 23:01:27
for(i=0;b[i]=a[i];i++);
608:デフォルトの名無しさん
07/11/22 23:16:00
昨日自己参照構造体でのリストについてかけねーって嘆いてた者だけど、
今日紙に書きつつ、これがこーなるから次はこうなるだろーってソース書いてったら無事動きました!
609:デフォルトの名無しさん
07/11/22 23:28:12
二次方程式の解の公式を求めるプログラムを作れとの課題が出たので考えてみたのですが
思うようにうまくいきません。
#include <stdio.h>
#include <math.h>
int main() {
double x1 ,x2, a, b, c;
printf( "a = " );
scanf("%lf" , &a);
printf( "b = " );
scanf("%lf" , &b);
printf( "c = " );
scanf("%lf" , &c);
x1 = -b+sqrt(b*b-4.0*a*c)/2.0*a;
x2 = -b-sqrt(b*b-4.0*a*c)/2.0*a;
printf("x1= %lf x2= %lf\n", x1, x2);
}
までできたのですが、
x1= -1.#IND00 x2= -1.#IND00
何を入力してもこの答えになってしまいます。
自分なりに見直してみたのですが間違いが分かりません。
どなたかご教示いただけたら幸いです。
610:デフォルトの名無しさん
07/11/22 23:32:03
そもそも式が違うじゃん
611:デフォルトの名無しさん
07/11/22 23:39:05
かけざんとわりざんはたしざんやひきざんよりもさきにけいさんします。
612:609
07/11/22 23:40:33
式からして間違ってるのでしょうか?
今の式じゃ-bがが最後に計算されてしまうってことですかね?
613:デフォルトの名無しさん
07/11/22 23:43:51
>>609
あなたが書いている式は
√(b^2 - 4ac)
x1 = -b + ------------- * a
2
こんなだよ
614:609
07/11/22 23:44:12
x1 = (-b+sqrt(b*b-4.0*a*c))/2.0*a;
x2 = (-b-sqrt(b*b-4.0*a*c))/2.0*a;
こんな感じでいいんでしょうか?あと
warning C4996: 'scanf' が古い形式として宣言されました。
というエラーが発生してるんですがこれが原因でしょうか?
習ったとおりに書いてみたのですが。
615:デフォルトの名無しさん
07/11/22 23:46:11
printfで%lfは標準じゃなかった気がする。
独自拡張とかC99とかならいけたかもしれんけど。
616:デフォルトの名無しさん
07/11/22 23:47:57
>>613
最後のaは分母にかかりますよね?
>>615
そうなんですか・・・家と学校じゃ環境が違うのでそのせいかもしれません。
他に間違ってるところありますかね?
617:デフォルトの名無しさん
07/11/22 23:48:09
>>614
それは警告であってエラーじゃない
618:デフォルトの名無しさん
07/11/22 23:48:11
>>614 (...)/2*aじゃなくて(...)/(2*a)
619:デフォルトの名無しさん
07/11/22 23:48:15
それだと
-b + √(b^2 - 4ac)
x1 = ----------------- * a
2
だな
>warning C4996: 'scanf' が古い形式として宣言されました。
warning C4996 でぐぐれ
620:デフォルトの名無しさん
07/11/22 23:48:46
>>616
かからねーよwww
621:デフォルトの名無しさん
07/11/22 23:51:39
>>618-620
なるほど・・・()付けない限り数字同士はくっ付かないんですか
ご指摘ありがとうございます。修正してみましたが、相変わらず答えは変わりません。
他に間違っているところがないのであれば家の環境が悪いということで諦めます。
622:デフォルトの名無しさん
07/11/22 23:53:55
入力してる値が悪いのでは?実数解を持つ値を入れてみ
623:デフォルトの名無しさん
07/11/22 23:59:22
>>622
答えがでました。適当に値を入れていたのが原因でしたか・・・
こんな基礎の問題に答えてくれて助かりました。
もっと勉強しないと駄目なようです、ありがとうございました。
624:デフォルトの名無しさん
07/11/23 00:02:47
適当にいれんなよwwwwwwwwwwww
625:デフォルトの名無しさん
07/11/23 00:05:03
Cに一番大事なのはとにかく基礎。
応用なんてものは後回しでとにかく基礎だぜ。
626:デフォルトの名無しさん
07/11/23 00:06:46
AもBもすっとばしていきなりCやるとはたかれるってことですよねー
627:デフォルトの名無しさん
07/11/23 00:11:14
たまにする背伸びは楽しいけどな
良い気分転換になる
628:デフォルトの名無しさん
07/11/23 00:12:09
fizzbuzzもかけない段階でchaos pp使ってメタプログラミングしたりな
629:助けてBOYZ
07/11/23 02:27:55
今日からの連休中に3つの課題を出されました。
ポインタ大嫌いです。
どなたか助けて下さい。
この問題が一つ目です。
【問】数字文字列を数値化する関数を作成して下さい。
<関数仕様>
書式 :short *AtoS(char *pStr, int *pRetCode);
戻り値:数字文字列のポインタ
引数 :char *pStr → 文字列の先頭アドレス
:int *pRetCode → 動作の成否を返す (正常なら:0,エラー時は-1)
※但し、NULLの時は返さない
処理 :pStrで与えられた文字列をshort型の数値に変換する
※負数(マイナス)にも対応
<考慮必要事項>
・short型の範囲外の数値文字列
・非数字文字列
・数字文字列と非数字文字列の混在(先頭の'-')は除く
・空文字列
・NULL
以上の5つはpRetCodeの示す領域にはエラーを返す、戻り値は0
630:デフォルトの名無しさん
07/11/23 02:28:53
>>629
いつまで逃げ続けられるの?
終わりはあるの?
631:デフォルトの名無しさん
07/11/23 02:40:04
>>629
自分で考える気がないなら宿題スレへ
スレリンク(tech板)
632:デフォルトの名無しさん
07/11/23 03:03:04
>>609
printf("x1= %f x2= %f\n", x1, x2);
で試したのか? どうみてこうだと思うんだが
633:デフォルトの名無しさん
07/11/23 03:05:05
>>632
そういう問題じゃないから
634:助けてBOYZ
07/11/23 03:11:41
何とか自分で作ってみました。
だけど戻り値?とか関数の意味がよく分からないし、何だかグダグダと
長いプログラムになってしまいました。
ポインタ&関数を理解するコツを教えて下さい。
635:デフォルトの名無しさん
07/11/23 03:15:18
戻り値ってshort*なの?
636:デフォルトの名無しさん
07/11/23 03:15:18
そもそも問題がおかしいのにどうしろと
文字列を数値化するのに文字列へのポインタ返してどうしろと
637:助けてBOYZ
07/11/23 03:22:30
戻り値はshortみたいです。
一応表示はされたんですけど…
ちょっとチェックして下さい。
おかしいところ教えて下さい。
638:助けてBOYZ
07/11/23 03:26:42
#include <stdio.h>
short AtoS(char *pStr, int *pRetCode);
int main(void)
{
short val;
int ret = 0;
val = AtoS("1234", &ret);
printf("%d\n", val);
val = AtoS("-789", &ret);
printf("%d\n", val);
val = AtoS("atai", &ret);
if (-1 == ret) {
printf("数値文字列でないデータが渡されました。\n");
}
return 0;
639:助けてBOYZ
07/11/23 03:27:56
改行が多くて入りませんでした。
間違ってるところあれば教えて下さい。
short AtoS(char *pStr, int *pRetCode)
{
int *p;
int i;
int sum;
short goukei;
goukei = 0;
if (pStr[0] == '-') {
for (i = 1; pStr[i] != '\0'; i++) { /* p[0]に'-'が入力された */
pStr[i] = pStr[i] - '0';
goukei = pStr[i] + (goukei * 10);
}
goukei = goukei - (goukei * 2);
return goukei;
}
goukei = 0;
for (i = 0; pStr[i] != '\0'; i++) { /* p[0]〜'\0'の中に数字だけが入力された */
if (pStr[i] > 48 && pStr[i] < 58) {
pStr[i] = pStr[i] - '0';
goukei = pStr[i] + (goukei * 10);
}
else {
*pRetCode = -1;
return pRetCode[0];
}
}
return goukei;
640:デフォルトの名無しさん
07/11/23 05:10:13
>>629
次からは宿題スレへ
#include <stdio.h>
short AtoS(char *pStr, int *pRetCode)
{
int n,s;
if(pRetCode == NULL) return 0;
*pRetCode = -1;
if(pStr == NULL || *pStr == '\0') return 0;
for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9';pStr++)
n=n*10+*pStr-'0';
n=s==1?-n:n;
if(*pStr != '\0' || *(pStr-1) == '-' || n<-32768 || n>32767) return 0;
*pRetCode = 0;
return n;
}
int main()
{
int i,s,r;
char t[][8]={"","-","a","-a","a1","1a","1-",
"-32769","-32768","-1","0","1","32767","32768","-000001","000001"};
printf("String\t: Value\t(RetCode)\n");
s = AtoS("1",NULL);
printf("\"1\"\t: %d\t(NULL)\n",s);
s = AtoS(NULL,&r);
printf("(NULL)\t: %d\t(%d)\n",s,r);
for(i=0; i<sizeof(t)/8; i++) {
s = AtoS(t[i],&r);
printf("\"%s\"\t: %d\t(%d)\n",t[i],s,r);
}
return 0;
}
641:640
07/11/23 06:31:08
訂正
#include <stdio.h>
short AtoS(char *pStr, int *pRetCode)
{
int n,s;
if(pRetCode == NULL) return 0;
*pRetCode = -1;
if(pStr == NULL || *pStr == '\0') return 0;
for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9' && n>=-32768;pStr++)
n=n*10-*pStr+'0';
n=s?n:-n;
if(*pStr != '\0' || *(pStr-1) == '-' || n<-32768 || n>32767) return 0;
*pRetCode = 0;
return n;
}
int main()
{
int i,s,r;
char t[][16]={"","-","a","-a","a1","1a","1-",
"-32769","-32768","-1","0","1","32767","32768","-000001","000001","4294967296"};
printf("String\t: Value\t(RetCode)\n");
s = AtoS("1",NULL);
printf("\"1\"\t: %d\t(NULL)\n",s);
s = AtoS(NULL,&r);
printf("(NULL)\t: %d\t(%d)\n",s,r);
for(i=0; i<sizeof(t)/16; i++) {
s = AtoS(t[i],&r);
printf("\"%s\"\t: %d\t(%d)\n",t[i],s,r);
}
return 0;
}
642:デフォルトの名無しさん
07/11/23 09:05:09
>>639
> pStr[i] = pStr[i] - '0';
文字列へのポインタ貰った関数が、中身を書き換えちゃいけない。
呼び出し側が、
n=AtoS("12345", &x);
とした場合、pStrの指す先は書き換えは不可能である処理系が多い。
普通、こういう文字列へのポインタを貰う関数は、
short AtoS(const char *pStr, int *pRetCode)
のようにconstを付ける。
643:デフォルトの名無しさん
07/11/23 09:23:18
>641
for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9' && n>=-32768;pStr++)
n=n*10-*pStr+'0';
↑こういう可読性の悪い書き方はやめようぜ…
644:デフォルトの名無しさん
07/11/23 09:24:47
わざとだろう
645:デフォルトの名無しさん
07/11/23 10:41:36
x[n]とr=0.6に対して
(x[0]-x[1])/x[1] + r * (x[1]-x[2])/x[2] + r^2 * (x[2]-x[3])/x[3] + ・・・
という計算を多くするとき計算が速く終わるコードって分かりますか?
x[n]は変化します 厳密な値ではなくていいです
646:デフォルトの名無しさん
07/11/23 10:42:45
あとx[n]の値は50%以内のずれしかありません
647:デフォルトの名無しさん
07/11/23 10:54:43
x[n]の平均値hとその誤差をd[n]とすると
(x[0]-x[1])/x[1]
=d[0]-d[1]/x[1]
=d[0]-d[1]/h
=(d[0]-d[1])*k k=1/h
とすれば速そうですね
648:デフォルトの名無しさん
07/11/23 11:57:13
(x[0]-x[1])/x[1] = x[0]/x[1]-1 でしょ。
-1の部分だけ分けて、
元の式=x[0]/x[1]+r*x[1]/x[2]+r^2*x[2]/x[3]....-(1+r+r^2+...)
とすれば、
r=0.6固定なら後ろの部分は定数だから前もって計算しておけば早いのかも。
精度が無視できる項以降は計算しないって手もあるのかな。
有効数字2ケタでいいなら、0.6^10以降は計算しなくてもいいと思う。
649:デフォルトの名無しさん
07/11/23 12:22:00
>>648
サンクス
650:574
07/11/23 13:43:42
>>576-579
ありがとうございました。
プロトタイプ宣言はやはり暗黙的にexternのですね。
社内のソースと合わせるため、一応これからはグローバルな関数はexternを付けて区別していこうと思います。
651:デフォルトの名無しさん
07/11/23 14:22:28
プロトタイプ宣言は厳密には暗黙的に extern なのではなくて、
それより前に static なプロトタイプ宣言や関数定義がなければ extern になり、
あれば static になる。
652:デフォルトの名無しさん
07/11/23 14:24:28
そういうときに「規定」って言葉を使うのかな。
653:デフォルトの名無しさん
07/11/23 14:26:23
ヘッダファイルで static な関数プロトタイプを書くことは無いし、
ヘッダファイルはファイルの先頭でインクルードするしで、
>>651 のような曖昧さがあっても実際の所これが問題になる事はない。
extern をつけるかどうかは好みの問題。
654:デフォルトの名無しさん
07/11/23 15:14:15
>>653
すまん。
前2行と後ろ2行の関係が分からん。
出来ればもうちょい詳しく頼む。
655:デフォルトの名無しさん
07/11/23 15:39:55
別のスレに翻訳単位をよくわかってない奴がいたな。
ヘッダファイルは彼にとって何か特別なものなのかもしれないが。
656:デフォルトの名無しさん
07/11/23 15:52:05
>>654
前2行の理由により、普通はヘッダファイル内にあるプロトタイプ宣言より先に
static なプロトタイプ宣言や関数定義が現れることはないから、
実質的には暗黙的に extern になると考えても問題ないという話。
657:デフォルトの名無しさん
07/11/23 19:14:43
ここに来てるのってみんなプログラマーなの?
658:デフォルトの名無しさん
07/11/23 19:36:03
プログラムが出来るって意味ではみんなプログラマーだろうな
659:デフォルトの名無しさん
07/11/23 19:59:26
職業=プログラマはあんまいないと思う
学生とSEばっか
660:デフォルトの名無しさん
07/11/23 20:09:55
いや、プログラマーって普通にいるだろ。
661:デフォルトの名無しさん
07/11/23 20:13:13
>>659
SEが居るならプログラマも居る事になるんだよ
662:デフォルトの名無しさん
07/11/23 20:19:42
SEと職業プログラマはちょっと違うけどな
663:デフォルトの名無しさん
07/11/23 20:21:40
あ、名刺はSEだけどプログラマって人はいっぱいいると思う
特に若い人。
664:デフォルトの名無しさん
07/11/23 20:35:16
昔職業プログラマって優れたコードを書く人だと思ってたけど、
なってみたら優れたコードとかは二の次で動くコードを書く人だと知った。
665:デフォルトの名無しさん
07/11/23 20:40:15
資格とかいらなくて、基本的にだれでもやれる職業だしな。
666:デフォルトの名無しさん
07/11/23 21:25:12
頭使うドカタだしな。
667:デフォルトの名無しさん
07/11/23 21:44:55
名刺もってるプログラマに出会ったことないんだけど
668:デフォルトの名無しさん
07/11/23 21:46:47
名刺は持ってるぞ
渡す機会は無いけど
669:デフォルトの名無しさん
07/11/23 21:47:29
名刺に「プログラマ」と書くとどうしても低く見られるから、
「システムエンジニア」と書くんだよ。
670:デフォルトの名無しさん
07/11/23 21:48:33
みんな普通にもってるでしょ?
自社以外の人にいっさい会わないで、こもって仕事してるならいらないけど。
名詞の肩書きに「プログラマー」とか入ってないって意味?
671:デフォルトの名無しさん
07/11/23 21:50:10
所属とか役職は入ってるけど、プログラマーとかSEとかってのは書いてないよね。
672:デフォルトの名無しさん
07/11/23 21:50:43
いや、会社が名刺をつくってくれないらしいんだが……
673:デフォルトの名無しさん
07/11/23 21:54:02
たまにしか使わないのに何十枚も刷ると高いから、
使うときに1枚だけプリンタから出せってことだよ。
674:デフォルトの名無しさん
07/11/23 21:58:23
数十枚刷れば数年もつ
675:デフォルトの名無しさん
07/11/23 22:03:15
プログラマが名刺出すような状況にならんだろ
SEとして派遣されたら名刺だすけどさ
676:デフォルトの名無しさん
07/11/23 22:10:23
>672-673
どんだけ貧乏な会社なんだよ。
100枚1000円ぐらいなのに…
677:デフォルトの名無しさん
07/11/23 22:11:36
使わないものを作ったってねぇ
678:デフォルトの名無しさん
07/11/23 22:15:03
あんま名刺出すとセールスの電話が増えて業務が滞る
679:デフォルトの名無しさん
07/11/23 23:19:51
>>678
わたくしどもはお客様の会社にプログラマを派遣いたしております
わたくしどもは常に優秀な人材を取り揃えてございます
おたくの会社にもおひとついかがでしょうか?
680:デフォルトの名無しさん
07/11/23 23:23:29
おもしろくないよ
681:デフォルトの名無しさん
07/11/23 23:32:04
そのとおり
笑えない話なのさ
682:デフォルトの名無しさん
07/11/23 23:47:54
Cでpow(5,i)の計算をした時のことでお聞きしたいことがあります。
最初はpow(5,0)=1,pow(5,1)=5,(5,2)=25....と順調です。
しかし、pow(5,23)の時に本来ならば11920928955078125のはずなのですが、
なぜか11920928955078124と1小さい数になってしまいます。
pow(5,24)以降も正しい数値が得られず誤差がどんどん大きくなっていってしまいます
この原因が全く分からず途方にくれている状態です…よろしくお願いします。
683:デフォルトの名無しさん
07/11/23 23:50:40
>>682
Wikipedia項目リンク
684:デフォルトの名無しさん
07/11/23 23:51:45
>>682
doubleの有効桁数を超えてるとか。
685:デフォルトの名無しさん
07/11/23 23:57:53
多売長ライブラリ
686:デフォルトの名無しさん
07/11/24 00:15:23
>683
倍精度浮動小数点で普通使われるIEEE 754 形式だと仮数部52ビットだけど、
pow(5,23)で52bitを超えるから、以降は誤差が出る。
誤差を避けるためには自分で作るしかない。
でも多分そういうアルゴリズムは探せばあるよ。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4985日前に更新/195 KB
担当:undef