C言語なら俺に聞け! Part 80

このエントリーをはてなブックマークに追加
スレ一覧をgotoで検索するといい
>>949
お前の書いたソース見なきゃ答えられない。
>>950さん
では、この場合は使ってもいいということですか?

>>949さん
goto文を使うとプログラムが読みにくくなるそうです。
スパゲッティ プログラム goto
でググってみると色々見つかります。
駄目だから環境によるんです。
956デフォルトの名無しさん:04/05/28 23:58
while(flag == 0){
  for(i=0;i<=7;i++){
        何らかの処理
        if(条件式==128){
           flag = 1;
         break;
        }
}
flagを使えばまあ一応書けるが。
>>945
gotoを使って読みにくくなる規模であれば、関数にして 途中でreturnすればよい。
そう大きくなくとも、後々を考えて関数化しておくと都合が良い場合もあるだろう。
>>956のような手はお勧めしない。
>>956さん>>957さん
ありがとうございました。
私個人としては、この場合のgotoは
スパゲッティにならないのでいいと思っていました。
>>956さんの方法もメモしておきます。
私のプログラムは全然大きくないので
とりあえず私の方式で行くことにします。
>>956
for(i=0;;i=(i+1)&7){
 なんらかの処理
 if(条件式==128){
  break;
 }
}

こんなんでどうよ?
関数に包んで return したくなるねぇ
いくつかの構造体を引数に取るAPIのテストをしようと思ってます。
その構造体に読み込ませるテストデータをファイルで用意しといて、
再婚パイルしなくてすむようにしたいです。そういう場合、
例えば
struct T1 {
char str[10];
int a;
int b;
};
のような構造体に読み込ませるデータは
"Hello, world"
1
2
とか書いておいて順番にロードしていくような
イメージでいるんですが、何かもうちょっとうまい
方法ってありますかね?皆さんはこういう場合
どういう風にテストデータを読み込ませてますか?
文字列に空白が無いなら

文字列 1 2
:
ってデータに汁かな
先頭に保存数とかいれておいて読むときはループで回す。当然バイナリな。
#include <stdio.h>

void StrnCpy(char *szDest, char *szSrc) {
szDest = (char*)malloc(strlen(szSrc)*sizeof(char));
strcpy(szDest, szSrc);
printf("StrnCpy内: %s\n", szDest);
}

int main(void) {
char *szPtr, *szSrc = "hoge";
StrnCpy(szPtr,szSrc);
printf("StrnCpy外: %s", szPtr);
return 0;
}

というようなコードを書いたんですが、出力はこうなります。
> StrnCpy内: hoge
> StrnCpy外: (null)
StrnCpy関数内部で割り当てたメモリは関数外部には持ち出せないようなのですが、これを回避するにはどうすれば
良いのでしょうか?ポインタを返すにはstaticとすると思いますが、この場合staticなローカル変数を宣言、初期化して
アドレスを第一引数(szDest)にコピーしても結果は変わりませんでした。どうか解決法をお願いします。
ぽいんたのぽいんた
966964:04/05/29 02:32
少し訂正です。strlenは終端\0抜きの文字数を返すはずなので
szDest = (char*)malloc(strlen(szSrc)*sizeof(char)+1);
とする必要がありそうですね。あと、この場合はUnicode利用時に発生する
文字数←→バイト数問題は放置の方向でお願いします。
>964 だからポインタのポインタ使えって
968964:04/05/29 02:36
>>965さん
ポインタのポインタを使って手抜き実装してみたところ見事にぬるぽで落ちたのでいろいろ調べてがんばってみます。
ありがとうございます。
void StrnCpy(char **szDest, char *szSrc) {
*szDest = (char*)malloc(strlen(szSrc)*sizeof(char));
strcpy(*szDest, szSrc);
printf("StrnCpy内: %s\n", *szDest);
}

char *szPtr, *szSrc = "hoge";
StrnCpy(&szPtr,szSrc);
970964:04/05/29 03:00
うまく行きました。
http://black.sakura.ne.jp/~third/programming/c/c25.html
このあたりの解説を読んでコードを書いているうちに>>969さんの書き込みに気付いてちょっとカンニングしてしまいましたが。
Cに対する理解が深まった気がします。本当にありがとうございました。
#include <stdio.h>

- void StrnCpy(char *szDest, char *szSrc)
+ char *StrnCpy(char *szDest, char *szSrc)
{
szDest = (char*)malloc(strlen(szSrc)*sizeof(char));
strcpy(szDest, szSrc);
printf("StrnCpy内: %s\n", szDest);
+ return szDest;
}

int main(void)
{
char *szPtr, *szSrc = "hoge";
- StrnCpy(szPtr,szSrc);
+ szPtr=StrnCpy(szPtr,szSrc);
printf("StrnCpy外: %s", szPtr);
return 0;
}

972デフォルトの名無しさん:04/05/29 05:03
以下のようなプログラムで、mapDataをポインタで返し
mainのmapを変更するとmapDataが変更されるようにしたいのですができません。
1次元配列ならできたのですが、2次元でのやり方を教えてください。

int *[5]GetMap(void)
{
static mapData[5][5];
return map;
}
int main(void)
{
int *map[5] = GetMap();
return 0;
}
>>972
なんか凄いソースだな。

それはさておき、無理に高次元配列に拘らなくてもええやん。
1次元配列を使ってあとは自前でシミュレートすれば。
typedef int (*m)[5];
m GetMap(void);

int (*map)[5]=GetMap();
975デフォルトの名無しさん:04/05/29 08:51
>>972

int (*GetMap(void))[5]
{
    static int mapData[5][5];
    
    return mapData;
}
int main(void)
{
    int (*map)[5] = GetMap();
    
    return map[0][0];
}
976デフォルトの名無しさん:04/05/29 09:05
>>945

int main(void)
{
    int i, j;
    
    for (j = 0; ; j++) {
        i = j & 7;
        何らかの処理;
        if(条件式 == 128){
            break;
        }
    }
}

128ならループの外で判断できそうだが。
977デフォルトの名無しさん:04/05/29 09:39
空白あけろ
978デフォルトの名無しさん:04/05/29 10:01
for (i = 0; なんらかの処理, 条件式 != 128; i = (i + 1) & 7) {
  ;
979ボブ:04/05/29 10:04
DSPの実験でスルー動作のプログラミングを作成したのですが
スルー動作とは解りやすくいうと何ですか?詳しく教えて下さい。
お願いします。
980デフォルトの名無しさん:04/05/29 10:09
さて次の話題
981972:04/05/29 10:50
ありがとうございます。

>>973
今まではそのやり方でやっていました。
1次元にして[y*MAP_SIZE_X+x]みたいな感じにして。

>>974>>975
どちらもできました。
まだ、この文法が分からないので、参考にさせてもらい勉強します。
982945:04/05/29 11:02
>>959さん>>976さん
ありがとうございます。
実行速度はn%8よりn&7のほうが速いのですね。
勉強になりました。
四則演算と同じ計算をビット演算で行える時は
ビット演算を使いたいと思います。
あと、なるべくgotoは使わずに
>>959さん>>976さんの方法を使ってみたいと思います。
それでは、しつれいします。
まあgotoも使い方によっちゃ悪くない。同じ(パラメータのみ多少異なる)エラー処理をいくつも
書くのも、それだけのために他関数に飛ばしてソースを追いにくくするのも馬鹿らしい場合なんかには
積極的に使ってもいいんじゃないかと@Microsoft
Cでgotoを使わない理由を考察するスレ goto loop3;
http://pc5.2ch.net/test/read.cgi/prog/1072018444/
985デフォルトの名無しさん:04/05/29 13:01
ttp://www.sikaku.gr.jp/nj/index4.html
C言語プログラミング能力認定試験(3級)を受けようと
思っていますが、どのくらいの難しさでしょうか?
自分は「独習C」で勉強した程度です、アドバイスお願いします。
987デフォルトの名無しさん:04/05/29 13:24
>>986
俺が知っているものと同じなら、Cの歴史も勉強しておけ。
988986:04/05/29 13:28
>>986
アドバイスありがとうございます。
Cの歴史についての勉強も頑張ってみます。
989デフォルトの名無しさん:04/05/29 13:50
新スレ立ててくるぞおめーら。
>989乙。

C言語なら俺に聞け! Part 81
http://pc5.2ch.net/test/read.cgi/tech/1085806791/
質問です。
for(m_hoge=1;m_hoge<m_hoge2;m_hoge++)
のようにメンバ変数をforに入れるより
int hoge2=m_hoge2;
for(int i=1;i<hoge2;i++)
とした方が高速化するといわれ、実際にやってみたら高速化したんですが
これはどのような理由ででしょうか?
新たに変数を作ってコピー回数が増えて逆に遅くなるんじゃないか?と思ったのですが・・・

初歩的な質問ですみません。
992デフォルトの名無しさん:04/05/29 15:18
>>991
そのm_hogeというのは実際はa.m_hogeみたいな形か?
それなら比較するたびに構造体の中からメンバーを取り出す手間が省けるから速くなったんじゃないの?
>>991
http://www.emit.jp/prog/prog_opt0.html
ここに同じような最適化の例がある。
994デフォルトの名無しさん:04/05/29 15:25
レジスタにおかれるかどうかってことか?
アセンブルリストを見ろ。
---終了---
996デフォルトの名無しさん:04/05/29 15:33
>>995
氏ね
997デフォルトの名無しさん:04/05/29 16:05
>>991
コンパイラが賢ければどちらも同じになる。
メンバ変数ということはC++でスレ違いだが、コンパイラがforの内側の処理でそれが
変更される可能性があると思ってしまうと、毎回メモリアクセスになってしまう。
998デフォルトの名無しさん:04/05/29 16:11
999get
999デフォルトの名無しさん:04/05/29 16:12
999gets
1000デフォルトの名無しさん:04/05/29 16:12
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。